Scala是否有任何按值而不是按键排序的集合?

时间:2011-08-06 22:12:04

标签: scala

例如,以下代码生成订单Stock1,Stock2,Stock3

var tm = TreeMap("Stock1" -> 4.2, "Stock3" -> 3.7, "Stock2" -> 5.9)

我正在寻找的是可以产生以下内容的集合或技术

Stock2,Stock1,Stock3以降序代表价格

4 个答案:

答案 0 :(得分:23)

scala> val sorted1 = tm.toList.sortBy (_._2)                                                           
sorted1: List[(java.lang.String, Double)] = List((Stock3,3.7), (Stock1,4.2), (Stock2,5.9))

scala> val sorted2 = tm.toList.sortBy (_._1)
sorted2: List[(java.lang.String, Double)] = List((Stock1,4.2), (Stock2,5.9), (Stock3,3.7))

还原sorted1,使其降序或sortWith:

scala> val sorted3 = tm.toList.sortWith (_._2 > _._2) 
sorted3: List[(java.lang.String, Double)] = List((Stock2,5.9), (Stock1,4.2), (Stock3,3.7))

版本4,按-x(减去x)排序:

scala> val sorted4 = tm.toList.sortBy (-_._2)   
sorted4: List[(java.lang.String, Double)] = List((Stock2,5.9), (Stock1,4.2), (Stock3,3.7))

答案 1 :(得分:4)

我认为没有内置集合可以使地图按值排序,以便您可以按线性时间读出已排序的值,但how to sort a scala.collection.Map[java.lang.String, Int] by its values?显示了按以下顺序排列的输入的方法值。

答案 2 :(得分:4)

这里的问题是你按键查找,所以按值排序是没有用的 - 你仍然需要以某种方式跟踪键。

例如,考虑按值排序的LinkedHashMap。它通过哈希表找到密钥,并使用链表进行迭代。不幸的是,它需要O(n)插入,因为它必须遍历列表才能找到密钥。

然后可以通过保留树和哈希表来改善这一点。无论如何,添加或删除元素的操作仍然受到打击,因为它们现在改变了两个数据结构。而这甚至不计算修改元素。

那么,为什么不只是对地图的元素进行排序?

tm.toSeq.sorted(Ordering by ((_: (String, Double))._2))

答案 3 :(得分:2)

如果您的数据集比严格的键值对更复杂:

有一个java数据集库,您可以使用该数据集库按该数据集中表示的任何字段对数据集进行排序。它易于使用且极其灵活。

http://casperdatasets.googlecode.com