Scala: how can I sort an array of tuples by their second element?

后端 未结 7 652
悲&欢浪女
悲&欢浪女 2021-01-31 13:39

is there a way in Scala to sort an array of tuples using and arbitrary comparison function? In particular I need to sort and array of tuples by their second element, but I wante

相关标签:
7条回答
  • 2021-01-31 14:20

    On Scala 2.8 (yes, again :), you can also do this:

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

    In the specific case of pairs, this can also work to sort first by the second element, and then by the first:

    scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_.swap))
    
    0 讨论(0)
  • 2021-01-31 14:22

    2.7 and not in place:

    (Array((2,3), (4,2), (1,5)).toList.sort (_._2 < _._2)).toArray
    
    0 讨论(0)
  • 2021-01-31 14:28

    In scala 2.8, there is a method sortBy. Here is a simple use case:

    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>
    
    0 讨论(0)
  • 2021-01-31 14:29

    If it's an Array, it's probably typical to use in-place sorting algorithms. However, in idiomatic Scala code, mutable collections are usually not encouraged/used. If that's the case and you have am immutable collection (or would like to not modify the Array in place), use 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)
    

    sorting an Array or any other collection of tuples:

    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))
    
    0 讨论(0)
  • 2021-01-31 14:33
    val l = List((2, 1), (3, 2), (0, 3))
    l sort { case(a, b) => a > b }
    
    0 讨论(0)
  • 2021-01-31 14:39

    You probably want def stableSort[K](a : Seq[K], f : (K, K) => Boolean) : Array[K] from scala.util.Sorting.
    Your comparison function would be something like _._2 < _._1

    0 讨论(0)
提交回复
热议问题