【问题标题】:Sort an ArrayList by primitive boolean type按原始布尔类型对 ArrayList 进行排序
【发布时间】:2015-03-16 03:25:52
【问题描述】:

我想使用布尔类型对我的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;
        }
    });

排序前排序: 真的 真的 真的 错误的 错误的 错误的 错误的 真的 错误的 假的

排序后排序: 错误的 错误的 真的 真的 真的 真的 错误的 错误的 错误的 假的

【问题讨论】:

  • 如果是==,则返回0。如果是!=,则根据第一个是真还是假,使用1或-1。
  • 您的第二个if 条件永远不会评估为true。它是第一个的同义词。
  • 你需要定义你需要的排序,是否与id有关?

标签: java sorting arraylist java-collections-api


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    所以:

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

    应该这样做。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 永远不要做if (someboolean == true)之类的事情,这是一种代码味道,相当于if (someboolean)
      • 第二个嵌套的if (if (b1 == false) {) 可以只替换为return 1;
      • 你说的都对,外层if的正文可以换成return b1 ? -1 : 1;:D
      • 整个 if 逻辑可以替换为 return (b1 != b2) ? (b1) ? -1 : 1 : 0;
      • 很遗憾,现在代码的可读性非常低,优化太多
      【解决方案4】:

      另一种方法是:

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

      【讨论】:

      • 对此进行评论:Boolean.compare 需要 API 级别 19,如果您的应用支持较低级别,您应该使用其他回复,否则这适用于 API 19 及更高版本。
      • 对于降序,我可能会选择-Boolean.compare(abc1.isClickable,abc2.isClickable)。切换 abc1 和 abc2 的顺序好像真的很容易漏掉,让人以为这个方法只是升序排序。
      • 使用 Java 8:Collections.sort(abc, (object1, object2) -&gt; Boolean.compare(object1.isClickable, object2.isClickable)); 可以解决问题。 False 将位于列表的顶部。我还建议在排序后使用 LinkedList 而不是 ArrayList 来维护顺序
      • 您是否遇到了 nullPointerException。您是如何使用 Comparator.nullsLast 或 nullsFirst 的?
      【解决方案5】:

      Java 8:

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

      【讨论】:

        【解决方案6】:

        这种方式也是可以的。

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

        【讨论】:

          【解决方案7】:

          为什么不使用这样的东西,它更容易和 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());
          

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

          【讨论】:

            【解决方案8】:

            使用 Kotlin 你可以这样做:

            listOfABCElements.sortBy { it.isClickable }
            

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

            倒序:

            listOfABCElements.sortByDescending { it.isClickable }
            

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

            【讨论】:

            • 这是不正确的:listOfABCElments.sortBy { it.isClickable } 输出为:false,false,true,true,true 而相反的顺序为:listOfABCElements.sortByDescending { it.isClickable } 输出为:true,true,true,false ,假
            猜你喜欢
            • 2010-09-17
            • 2013-11-16
            • 2019-08-07
            • 1970-01-01
            • 2021-04-15
            • 1970-01-01
            • 2010-10-28
            • 2015-07-08
            • 1970-01-01
            相关资源
            最近更新 更多