如何在java中使用布尔值对ArrayList进行排序?

2024-04-25

我有一个带有自定义对象的 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;
    }
}

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

See the java.util.Comparator 定义 http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#compare(T,%20T) :

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

在前面的描述中,符号sgn(表达式)指定 数学符号函数,定义为返回以下之一 -1、0 或 1,具体取决于表达式的值是负数、零还是正数。

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

实现者还必须确保关系是可传递的: ((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 开始 http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html#compare%28boolean,%20boolean%29 :

public int compare(ObjPerson o1, ObjPerson o2) {
   boolean b1 = o1.select.isChecked();
   boolean b2 = o2.select.isChecked();
   return Boolean.compare( b1, b2 );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在java中使用布尔值对ArrayList进行排序? 的相关文章

随机推荐