29

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

ABC.java

public class Abc {
 int id;
 bool isClickable;

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

主.java

List<Abc> abc = new ArrayList<Abc>();

//add entries here

//now sort them
Collections.sort(abc, new Comparator<Abc>(){
        @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;
        }
    });

排序前的顺序:真真真假假假假真假假

排序后排序:false false true true true false false false false

4

8 回答 8

51

另一种方法是:

Collections.sort(abc, new Comparator<Abc>() {
        @Override
        public int compare(Abc abc1, Abc abc2) {
            return Boolean.compare(abc2.isClickable,abc1.isClickable);
        }
    });
于 2015-01-17T17:59:09.670 回答
23

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

所以:

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

        return b2 - b1

应该这样做。

于 2015-01-17T17:50:47.140 回答
21

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

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

输出:真,真,真,假,假

reverseOrder 是先为真,后为假,在其他情况下,先为假

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

输出:假,假,真,真,真

于 2018-04-05T16:14:50.907 回答
11

使用 Kotlin 你可以这样做:

listOfABCElements.sortBy { it.isClickable }

输出:假,假,真,真,真

以相反的顺序:

listOfABCElements.sortByDescending { it.isClickable }

输出:真,真,真,假,假

于 2019-07-12T09:14:29.390 回答
10

我希望true有价值的项目首先出现。我的解决方案是:

Collections.sort(m_mall, new Comparator<Mall>(){

        @Override
        public int compare(Mall mall1, Mall mall2){

            boolean b1 = mall1.isClickable;
            boolean b2 = mall2.isClickable;

            return (b1 != b2) ? (b1) ? -1 : 1 : 0;
        }
    });
于 2015-01-17T17:51:06.930 回答
5

一个简单的建议是使用 objectBoolean而不是 boolean 和 use Collections.sort

但是,您必须知道falsewill 在 the 之前,true因为 true 表示为1,false 表示为0。但是,您可以更改您的算法并以相反的顺序访问。

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

于 2015-01-17T17:49:19.260 回答
5

这种方式也是可以的。

myList.sort((a, b) -> Boolean.compare(a.isSn_Principal(), b.isSn_Principal()));
于 2017-12-14T09:25:23.230 回答
4

爪哇 8:

 Collections.sort(abc, (abc1, abc2) ->
                  Boolean.compare(abc2.isClickable(), abc1.isClickable()));
于 2016-07-27T23:34:53.733 回答