按原始布尔类型对ArrayList进行排序

我想使用布尔类型对ArrayList进行排序。 基本上我想首先显示true条目。 这是我的代码如下:

Abc.java

 public class Abc { int id; bool isClickable; Abc(int i, boolean isCl){ this.id = i; this.isClickable = iCl; } } 

Main.java

 List abc = new ArrayList(); //add entries here //now sort them Collections.sort(abc, new Comparator(){ @Override public int compare(Abc abc1, Abc abc2){ boolean b1 = abc1.isClickable; boolean b2 = abc2.isClickable; if (b1 == !b2){ return 1; } if (!b1 == b2){ return -1; } return 0; } }); 

排序前的顺序:true true true false false false false true false false

排序后的顺序:false false true true true true false false false false

另一种方法是:

 Collections.sort(abc, new Comparator() { @Override public int compare(Abc abc1, Abc abc2) { return Boolean.compare(abc2.isClickable,abc1.isClickable); } }); 

在这种情况下,最简单的解决方案之一是将布尔值转换为整数,其中false0true1 。 然后返回第二个和第一个的差异。

所以:

  int b1 = abc1.isClickable ? 1 : 0; int b2 = abc2.isClickable ? 1 : 0; return b2 - b1 

应该这样做。

我希望首先显示具有true值的项目。 我的解决方案是:

 Collections.sort(m_mall, new Comparator(){ @Override public int compare(Mall mall1, Mall mall2){ boolean b1 = mall1.isClickable; boolean b2 = mall2.isClickable; return (b1 != b2) ? (b1) ? -1 : 1 : 0; } }); 

为什么不使用这样的东西,它更容易和java 8

 listOfABCElements = {true, false, false, true, true}; listOfABCElements.stream().sorted(Comparator.comparing(Abc::isClickable,Comparator.reverseOrder()).collect(Collectors.toList()); 

输出:true,true,true,false,false

reverseOrder用于第一个为true,在为false之后,在其他情况下,falses首先出现

 listOfABCElements.stream().sorted(Comparator.comparing(Abc::isClickable).collect(Collectors.toList()); 

输出:false,false,true,true,true

一个简单的建议是使用对象Boolean而不是boolean并使用Collections.sort

但是,您必须知道false将在true之前,因为true表示为1而false表示为0 。 但是,您可以按相反顺序更改算法和访问权限。

编辑 :正如soulscheck所说,您可以使用Collections.reverseOrder来恢复比较器强加的排序。

Java 8:

  Collections.sort(abc, (abc1, abc2) -> Boolean.compare(abc2.isClickable(), abc1.isClickable())); 

这也有可能。

 myList.sort((a, b) -> Boolean.compare(a.isSn_Principal(), b.isSn_Principal()));