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

stu*_*d91 19 java sorting arraylist java-collections-api

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

Abc.java

public class Abc {
 int id;
 bool isClickable;

 Abc(int i, boolean isCl){
    this.id = i;
    this.isClickable = iCl;
 }
 }
Run Code Online (Sandbox Code Playgroud)

Main.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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

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

小智 37

另一种方法是:

Collections.sort(abc, new Comparator<Abc>() {
        @Override
        public int compare(Abc abc1, Abc abc2) {
            return Boolean.compare(abc2.isClickable,abc1.isClickable);
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 只需对此进行评论:如果您的应用支持较低级别,则Boolean.compare需要API级别19,您应该使用其他回复,否则这适用于API 19及更高版本. (6认同)

sou*_*eck 17

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

所以:

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

        return b2 - b1
Run Code Online (Sandbox Code Playgroud)

应该这样做.


小智 14

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

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

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

reverseOrder的顺序是第一个是真的,在假之后,在其他情况下,首先是falses

listOfABCElements.stream().sorted(Comparator.comparing(Abc::isClickable).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

output:false,false,true,true,true


stu*_*d91 9

我想要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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 第二个嵌套的`if`(`if(b1 == false){`)可以替换为`return 1;`. (2认同)

Ale*_*oba 9

使用 Kotlin,你可以这样做:

listOfABCElements.sortBy { it.isClickable }
Run Code Online (Sandbox Code Playgroud)

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

以相反的顺序:

listOfABCElements.sortByDescending { it.isClickable }
Run Code Online (Sandbox Code Playgroud)

输出:真、真、真、假、假

  • 这是不正确的: ```listOfABCElments.sortBy { it.isClickable }``` 输出将是: false,false,true,true,true 而相反的顺序将是: `listOfABCElements.sortByDescending { it.isClickable }` 输出将是:真,真,真,假,假 (11认同)

Jea*_*ard 5

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

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

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


小智 5

这样也是可以的。

myList.sort((a, b) -> Boolean.compare(a.isSn_Principal(), b.isSn_Principal()));
Run Code Online (Sandbox Code Playgroud)