9

我有一个带有自定义对象的 ArrayList。它们包含一个我想要排序的复选框对象。我正在使用此比较器功能对其进行排序:

我正在使用 XOR 运算符来检查它们是否彼此相等,然后取反。

但是,这不起作用,并且列表保持相同的顺序。

有谁知道出了什么问题?

public class CustomSelectSort implements Comparator<ObjPerson> {
    @Override
    public int compare(ObjPerson o1, ObjPerson o2) {
        return !(o1.select.isChecked() ^ o2.select.isChecked()) ? 1 : -1;
    }
}
4

1 回答 1

20

您只返回 -1(小于)或 +1(大于),从不返回 0(等于)。

请参阅java.util.Comparator 定义

比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个。

在前面的描述中,符号sgn(expression)表示数学符号函数,它被定义为根据表达式的值是负数、零还是正数返回-1、0或1之一。

实现者必须确保所有 x 和 y 的 sgn(compare(x, y)) == -sgn(compare(y, x))。(这意味着当且仅当 compare(y, x) 抛出异常时 compare(x, y) 必须抛出异常。)

实现者还必须确保关系是可传递的: ((compare(x, y)>0) && (compare(y, z)>0)) 意味着 compare(x, z)>0。

最后,实现者必须确保 compare(x, y)==0 意味着所有 z 的 sgn(compare(x, z))==sgn(compare(y, z))。

通常是这样,但并不严格要求 (compare(x, y)==0) == (x.equals(y))。一般来说,任何违反此条件的比较器都应清楚地表明这一事实。推荐的语言是“注意:这个比较器强加了与等于不一致的排序。”

Java 1.7 之前的提案:

public int compare(ObjPerson o1, ObjPerson o2) {
   boolean b1 = o1.select.isChecked();
   boolean b2 = o2.select.isChecked();
   if( b1 && ! b2 ) {
      return +1;
   }
   if( ! b1 && b2 ) {
      return -1;
   }
   return 0;
}

从 Java 1.7 开始的提案:

public int compare(ObjPerson o1, ObjPerson o2) {
   boolean b1 = o1.select.isChecked();
   boolean b2 = o2.select.isChecked();
   return Boolean.compare( b1, b2 );
}
于 2013-08-25T21:45:19.710 回答