【发布时间】:2012-03-19 19:55:07
【问题描述】:
我正在拼命寻找一种对字符串列表进行排序的方法,其中字符串是以下形式的预定义标识符:a1.1、a1.2、...、a1.100、a2.1、a2。 2,....,a2.100,...,b1.1, b1.2,.. 等等,这已经是正确的顺序。因此,每个标识符首先按其第一个字符排序(降序字母顺序),并在此排序中按连续数字降序排列。我尝试了 sortWith,它提供了一个排序函数,为所有两个连续的列表成员指定了上述规则。
scala> List("a1.102", "b2.2", "b2.1", "a1.1").sortWith((a: String, b: String) => a.take(1) < b.take(1) && a.drop(1).toDouble < b.drop(1).toDouble)
res2: List[java.lang.String] = List(a1.102, a1.1, b2.2, b2.1)
这不是我预期的顺序。但是,通过交换表达式的顺序,如
scala> List("a1.102", "b2.2", "b2.1", "a1.1").sortWith((a: String, b: String) => (a.drop(1).toDouble < b.drop(1).toDouble && a.take(1) < b.take(2)))
res3: List[java.lang.String] = List(a1.1, a1.102, b2.1, b2.2)
这确实给了我(至少在这个例子中)所需的顺序,我也不明白。
如果有人能给我一个提示,我将非常感激那里到底发生了什么以及我如何根据需要对列表进行排序(使用比仅比较 更复杂的布尔表达式)。另一个问题:我正在排序的字符串(在我的示例中)实际上是来自 HashMap m 的键。任何解决方案都会影响按其内的键对 m 进行排序
m.toSeq.sortWith((a: (String, String), b: (String, String)) => a._1.drop(1).toDouble < b._1.drop(1).toDouble && a._1.take(1) < b._1.take(1))
非常感谢您!
【问题讨论】:
-
非常感谢大家!我是 Scala 编程的新手,但我非常喜欢它!但是我仍然让自己陷入了一些严重的头痛,像这样的事情;)我假设,我会得到一个列表,其中每两个连续的元素都符合我的约束。我接受了第二个答案,因为我现在一切都清楚了。因为每个答案都确实帮助我了解了更多信息,但我是这个委员会的新手,请告诉我,如果需要,我如何也能给予这些有用的答案!谢谢大家的友好:) 干杯!
标签: scala sorting scala-collections