代码之家  ›  专栏  ›  技术社区  ›  pau.estalella

scala:如何按元组的第二个元素对数组进行排序?

  •  50
  • pau.estalella  · 技术社区  · 15 年前

    scala中有没有使用和任意比较函数对元组数组进行排序的方法?特别是,我需要根据第二个元素对元组进行排序和数组,但我想知道一种对元组数组排序的通用技术。

    谢谢!

    7 回复  |  直到 6 年前
        1
  •  23
  •   Erik Kaplun    9 年前

    您可以使用此代码:

    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 . 我希望你能接受。

        2
  •  121
  •   Cory Klein    6 年前

    在scala 2.8中,有一个方法sortby。下面是一个简单的用例:

    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>
    
        3
  •  9
  •   Erik Kaplun    11 年前

    如果是 Array ,使用就地排序算法可能是典型的。然而,在惯用的scala代码中,通常不鼓励/使用可变集合。如果是这种情况,并且您有一个不可变的集合(或者不想修改 数组 就地使用 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)
    

    排序 数组 或任何其他元组集合:

    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))
    
        4
  •  3
  •   Daniel C. Sobral    15 年前

    在scala 2.8上(是的,同样是:),您也可以这样做:

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

    在成对的特定情况下,这也可以用于排序 第一 通过第二个元素,然后通过第一个元素:

    scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_.swap))
    
        5
  •  2
  •   user unknown    15 年前

    2.7不到位:

    (Array((2,3), (4,2), (1,5)).toList.sort (_._2 < _._2)).toArray
    
        6
  •  1
  •   tstenner    15 年前

    你可能想要 def stableSort[K](a : Seq[K], f : (K, K) => Boolean) : Array[K] 来自scala.util.sorting。
    你的比较函数应该是 _._2 < _._1

        7
  •  1
  •   missingfaktor Kevin Wright    15 年前
    val l = List((2, 1), (3, 2), (0, 3))
    l sort { case(a, b) => a > b }