Java sortWith对某些字符串使用基本字符比较失败

Java sortWith对某些字符串使用基本字符比较失败,java,scala,sorting,Java,Scala,Sorting,我想应用一个自定义排序比较器,如下所示: myString.sortWith{ case (c1,c2) => c1.compareTo(c2) <= 0} 那很好。考虑一个更复杂的字符串: scala> val str = "TOADS POOLS hoppin good service & repair" str: String = TOADS POOLS hoppin good service & repair scala> str.sortW

我想应用一个自定义排序
比较器
,如下所示:

 myString.sortWith{ case (c1,c2) => c1.compareTo(c2) <= 0}
那很好。考虑一个更复杂的字符串:

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
scala>val str=“蟾蜍池希望得到良好的服务和维修”
str:String=TOADS POOL hoppin良好的服务和维修

scala>str.sortWith{case(c1,c2)=>c1.compareTo(c2)文档明确指出,
sortWith
需要一个函数
lt
,该函数返回
true
当且仅当第一个操作数超过(严格地说是LessThan)第二个操作数:

lt比较函数,用于测试第一个参数是否按所需顺序先于第二个参数


你的
c1.与(c2)相比@RameshMaharjan请仔细阅读另一条:对于这一条,提供的比较器不是可传递的。而对于上述情况,它是可传递的。@MarkrotVeel我看不出这是链接问题的重复。Java的比较器生成有符号整数,而Scala的
sortWith
需要一个布尔值。它正好是是布尔值,这是违反直觉的。如果OP使用比较器,比如
排序
,那么问题根本就不会发生。@MarkrotVeel在其他问题/答案中没有提到整数比较需要
的细微差别,嗯……显然,我可以单枪匹马地解开它……很高兴知道。很好catch!所以它处理第一个字符串的原因是没有重复的字符。@javadba我认为您应该能够强制执行一个有重复字符的示例,但不会引发异常。可能发生的情况是,即使有重复的字符和无效的
lt
,算法也不会运行到任何无效状态。
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
str.sortWith{ case (c1,c2) => c1.compareTo(c2) < 0}
//"      &ADLOOOPSSTacdeeeghiiinoooppprrrsv"