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, falsefalse, true 相同时,它显然不起作用。 (假设您正在排序以分隔 truefalse 如果您的项目使用 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进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中检查布尔方法的返回值

如何在 Java 中搜索一串键/值对

使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程

java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。

Android-java-如何按对象内的某个值对对象列表进行排序

如何根据不同df中提供的索引值对数据框中的特定列进行求和。返回总和和布尔 T/F