- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想按如下方式应用自定义排序比较器
:
myString.sortWith{ case (c1,c2) => c1.compareTo(c2) <= 0}
这应该按照代码点值对字符串的字符进行排序。
然而它并不总是有效。考虑一个简单的字符串 cab312
:
val str = "cab312"
str.sortWith{ case (c1,c2) => c1.compareTo(c2) <= 0}
res0: String = 123abc
这很好用。考虑一个更复杂的字符串:
scala> val str = "TOADS POOLS hoppin good service & repair"
str: String = TOADS POOLS hoppin good service & repair
scala> str.sortWith{ case (c1,c2) => c1.compareTo(c2) <= 0}
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:899)
at java.util.TimSort.mergeAt(TimSort.java:516)
at java.util.TimSort.mergeCollapse(TimSort.java:441)
at java.util.TimSort.sort(TimSort.java:245)
at java.util.Arrays.sort(Arrays.java:1438)
at scala.collection.SeqLike$class.sorted(SeqLike.scala:648)
at scala.collection.immutable.StringOps.sorted(StringOps.scala:29)
at scala.collection.SeqLike$class.sortWith(SeqLike.scala:601)
at scala.collection.immutable.StringOps.sortWith(StringOps.scala:29)
... 32 elided
所以 .. 我们得到一个 java.lang.IllegalArgumentException: Comparison method violates its general contract!
这是怎么回事?同一个 comparator
怎么会既成功又失败。这是 timsort
中的错误吗?无论如何有解决方法吗?
最佳答案
文档明确指出sortWith
需要一个函数 lt
返回 true
当且仅当第一个操作数先于(严格Less Than)第二个操作数:
lt the comparison function which tests whether its first argument precedes its second argument in the desired ordering.
你的 c1.compareTo(c2) <= 0
对于相等的元素返回 true,因此违反了 lt
的约定.改变 <=
至 <
消除了问题:
str.sortWith{ case (c1,c2) => c1.compareTo(c2) < 0}
//" &ADLOOOPSSTacdeeeghiiinoooppprrrsv"
关于java - 某些字符串使用基本字符比较的 sortWith 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51452294/
给定 Tuple2 的列表,我想对它们进行排序,以便其中一个的第二个元素是下一个的第一个元素。我试过用 sortWith 来做,但它在某些情况下有效,但在其他情况下无效。谁能看出我哪里搞砸了? Wel
我想按如下方式应用自定义排序比较器: myString.sortWith{ case (c1,c2) => c1.compareTo(c2) c1.compareTo(c2) val str =
我需要在 scala 上制作 java ArrayList 它是类、文件-字段的排序方法。要使用 ArrayList,我导入了 java.util.ArrayList 和 scala.collecti
我正在尝试对一组对象进行排序。 当我尝试使用 sortWith 函数只对对象中的一个字段进行排序时,它工作得很好。 当多个字段被排序时,它就会搞砸。 例如。 scala> val res = bran
我在使用 Ramda sortWith 按多列(升序或降序)对深度嵌套的对象数组进行排序时遇到问题。显然,排序是区分大小写的,并且导致以小写字母开头的值被放置到排序数组的最末尾。 首先,我导入必要的
我使用下面的 sortwith 方法对我的 ArrayList 进行排序,我想它会将订单号从小到大排序。比如10、9、8、7、6....0。但是结果不是我所期望的。请帮助解决这个问题。 company
我在 scala(2.11.8 和 2.12.1)中遇到 Seq[(Long, Double)] _._2) output >>> Seq[(Long, Double)] = List((11,11.
Scala 在标准库中包含了几种对列表进行排序的方法,例如对列表列表进行排序,可以使用: list.sorted list.sortWith(_x) 虽然这些可能是对列表进行排序的最简单方法,但我发现
我只是在探索 kotlin 集合,我观察到了一个重要的行为。 val sports = listOf( Sports("cricket", "7"), Sports("
我是一名优秀的程序员,十分优秀!