【问题标题】:What are the rules for writing a sort comparator编写排序比较器的规则是什么
【发布时间】:2016-07-18 17:34:56
【问题描述】:

我想根据成员的值对 A 类的对象进行排序:abcA 是最优先的 -> b 是下一个 - > c 的偏好最少。

比较器用于: x = x.sortWith(comparator) 这里,x 是一个 ArrayBuffer[A]

class A {var a,b,c = 0}

def comparator(f1:A, f2:A) = {
    if(f1.a == f2.a) {
      if(f1.b == f2.b) f1.c > f2.c
      else f1.b > f2.b
    }
    else f1.a > f2.a
  }

使用这个我得到:

**java.lang.IllegalArgumentException: Comparison method violates its general contract!**
    at java.util.TimSort.mergeLo(TimSort.java:747)
    at java.util.TimSort.mergeAt(TimSort.java:483)
    at java.util.TimSort.mergeCollapse(TimSort.java:410)
    at java.util.TimSort.sort(TimSort.java:214)
    at java.util.TimSort.sort(TimSort.java:173)
    at java.util.Arrays.sort(Arrays.java:659)
    at scala.collection.SeqLike$class.sorted(SeqLike.scala:618)
    at scala.collection.AbstractSeq.sorted(Seq.scala:41)
    at scala.collection.SeqLike$class.sortWith(SeqLike.scala:575)
    at scala.collection.AbstractSeq.sortWith(Seq.scala:41)

【问题讨论】:

  • 你返回boolean结果,但它应该是int
  • 使用我得到一个错误:错误:(124、58)类型不匹配;找到:需要 Int:布尔值
  • 你如何使用你的comparator?你能发布更多代码吗?
  • 当然!这里,x 是一个 ArrayBuffer[A] x = x.sortWith(comparator)

标签: java scala sorting illegalargumentexception


【解决方案1】:

使用sortBy 和元组更容易做到这一点:

x sortBy {f => (f.a, f.b, f.c)}

【讨论】:

    【解决方案2】:

    能否提供更全面的测试用例?这个例子对我来说运行良好:

    class A {var a,b,c = 0}
    
    def comparator(f1:A, f2:A) = {
        if(f1.a == f2.a) {
          if(f1.b == f2.b) f1.c > f2.c
          else f1.b > f2.b
        }
        else f1.a > f2.a
      }
    
    val testList = new scala.collection.mutable.ArrayBuffer[A]
    
    val val1 = new A()
    val val2 = new A()
    val val3 = new A()
    
    val1.a=1
    val1.b=1
    val1.c=1
    
    val2.a = 1
    val2.b = 1
    val2.c = 1
    
    val3.a = 2
    val3.b = 2
    val3.c = 3
    
    testList += val1 
    testList += val2 
    testList += val3
    
    testList.sortWith(comparator)
    

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2010-10-03
      • 2011-02-07
      相关资源
      最近更新 更多