簡體   English   中英

按原始布爾類型對 ArrayList 進行排序

[英]Sort an ArrayList by primitive boolean type

我想使用布爾類型對我的ArrayList進行排序。 基本上我想首先顯示true條目。 這是我的代碼如下:

驅動程序

public class Abc {
 int id;
 bool isClickable;

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

主程序

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;
        }
    });

排序前排序:true true true false false false false true false false

排序后的順序: false false true true true false false false false

另一種方法是:

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

應該這樣做。

為什么不使用這樣的東西,它更容易和 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());

輸出:假,假,真,真,真

我希望具有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;
        }
    });

使用 Kotlin,你可以這樣做:

listOfABCElements.sortBy { it.isClickable }

輸出:假,假,真,真,真

以相反的順序:

listOfABCElements.sortByDescending { it.isClickable }

輸出:真、真、真、假、假

一個簡單的建議是使用對象Boolean而不是 boolean 並使用Collections.sort

但是,您必須知道false將在true之前,因為 true 表示為1 , false 表示為0 但是,您可以更改算法並以相反的順序訪問。

編輯:正如soulscheck 所說,您可以使用Collections.reverseOrder來恢復比較器強加的排序。

爪哇 8:

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

也可以這樣。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM