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

时间:2015-01-17 17:44:23

标签: 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;
 }
 }

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

排序前的订单:      真正      真正      真正      假      假      假      假      真正      假      假的

排序后的订单: 假  假  真正  真正  真正  真正  假  假  假  假

8 个答案:

答案 0 :(得分:31)

另一种方法是:

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

答案 1 :(得分:15)

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

所以:

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

        return b2 - b1

应该这样做。

答案 2 :(得分:11)

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

TransactionScope

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

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

     public void RunDBTransactions() {
        try {
            using (TransactionScope transactionScope = new TransactionScope()) {
                RunOperationsOnFirstDB();
                RunOperationsOnSecondDB();

                transactionScope.Complete();
            }
        } catch (TransactionAbortedException tae) {
            // Aborted
        } catch (Exception ex) {
            // Deal with any other issues
        }
    }

    private void RunOperationsOnFirstDB() {
        using (SqlConnection connection = new SqlConnection(SQLConnectString)) {
            connection.Open();

            //Carry out database operations here
        }
    }

    private void RunOperationsOnSecondDB() {
        using (SqlConnection connection = new SqlConnection(SQLConnectString)) {
            connection.Open();

            //Carry out database operations here
        }
    }

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

答案 3 :(得分: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;
        }
    });

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:2)

Java 8:

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

答案 6 :(得分:1)

也有可能。

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

答案 7 :(得分:1)

使用Kotlin,您可以执行以下操作:

listOfABCElements.sortBy { it.isClickable }

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

反向:

listOfABCElements.sortByDescending { it.isClickable }

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