java - 如何在java中使用布尔值对ArrayLists进行排序?
Posted
技术标签:
【中文标题】java - 如何在java中使用布尔值对ArrayLists进行排序?【英文标题】:How to sort ArrayLists using booleans in java? 【发布时间】:2013-08-28 08:19:11 【问题描述】:我有一个带有自定义对象的 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;
【问题讨论】:
你能说明你在哪里调用排序吗? 您是否尝试过使用!=
而不是按位操作?
好吧,当true, false
与false, true
相同时,它显然不起作用。 (假设您正在排序以分隔 true
和 false
)
如果您的项目使用 Java 1.7,请查看我编辑的帖子
Sort an ArrayList by primitive boolean type的可能重复
【参考方案1】:
您只返回 -1(小于)或 +1(大于),从不返回 0(等于)。
见java.util.Comparator definition:
比较它的两个参数的顺序。返回一个负整数, 零或正整数,因为第一个参数小于、等于 到或大于秒。
在前面的描述中,符号 sgn(expression) 表示 数学符号函数,它被定义为返回一个 -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))。一般来说,任何比较器 违反此条件应明确表明这一事实。这 推荐的语言是“注意:这个比较器强加的顺序是 与equals不一致。”
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;
提案since 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 );
【讨论】:
帖子已编辑,因为 Java 1.7 为 Boolean 类添加了静态布尔比较器 已将 boolean b1 & b2 更改为 Boolean b1 & b2,因为 boolean 不调用它由 Boolean 提供的比较函数。 @AkashG:显式调用与 Boolean.compare 一起使用,此处未使用推理。见docs.oracle.com/javase/8/docs/api/java/lang/…以上是关于java - 如何在java中使用布尔值对ArrayLists进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程
java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。