斯卡拉:我怎样才能sorting元组数组的第二个元素?

有没有一种方法在Scala中使用和任意比较函数对元组进行sorting? 特别是我需要通过第二个元素对元组进行sorting和排列,但是我想知道一个通​​用的技术来对元组进行sorting。

谢谢!

你可以使用这个代码:

scala> val v = Array(('a', 2), ('b', 1)) v: Array[(Char, Int)] = Array((a,2), (b,1)) scala> scala.util.Sorting.stableSort(v, | (e1: (Char, Int), e2: (Char, Int)) => e1._2 < e2._2) scala> v res11: Array[(Char, Int)] = Array((b,1), (a,2)) 

不幸的是,似乎Scala不能推断传递给stableSort的数组的types。 我希望你没事。

在斯卡拉2.8,有一种方法sortBy。 这是一个简单的用例:

 Welcome to Scala version 2.8.0.r21376-b20100408020204 (Java HotSpot(TM) Client VM, Java 1.6.0_18). Type in expressions to have them evaluated. Type :help for more information. scala> val arr = Array(("One",1),("Two",2),("Four",4),("Three",3)) arr: Array[(java.lang.String, Int)] = Array((One,1), (Two,2), (Four,4), (Three,3)) scala> arr.sortBy(_._2) res0: Array[(java.lang.String, Int)] = Array((One,1), (Two,2), (Three,3), (Four,4)) scala> 

如果它是一个Array ,那么使用就地sortingalgorithm可能是典型的。 但是,在惯用的Scala代码中,可变集合通常不被鼓励/使用。 如果是这种情况,你有不可变的集合(或者不想修改Array ),请使用sortWith

 scala> val a = Array(1, 3, 2, 5) a: Array[Int] = Array(1, 3, 2, 5) scala> a.sortWith(_ > _) res6: Array[Int] = Array(5, 3, 2, 1) scala> a res7: Array[Int] = Array(1, 3, 2, 5) 

sortingArray或任何其他元组的集合:

 scala> val a = Array(('a', 1), ('b', 4), ('c', 5), ('d', 2)) a: Array[(Char, Int)] = Array((a,1), (b,4), (c,5), (d,2)) scala> a.sortWith(_._2 > _._2) res4: Array[(Char, Int)] = Array((c,5), (b,4), (d,2), (a,1)) scala> a res5: Array[(Char, Int)] = Array((a,1), (b,4), (c,5), (d,2)) 

在斯卡拉2.8(是的,再次:),你也可以这样做:

 val v = Array(('a', 2), ('b', 1)) scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_._2)) 

在成对的具体情况下,这也可以用第一个元素sorting,然后是第一个元素:

 scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_.swap)) 

2.7而且没有到位:

 (Array((2,3), (4,2), (1,5)).toList.sort (_._2 < _._2)).toArray 

您可能需要def stableSort[K](a : Seq[K], f : (K, K) => Boolean) : Array[K]来自scala.util.Sorting的def stableSort[K](a : Seq[K], f : (K, K) => Boolean) : Array[K]
你的比较函数就像_._2 < _._1

 val l = List((2, 1), (3, 2), (0, 3)) l sort { case(a, b) => a > b }