【问题标题】:How to Sort Objects in ArrayList by more than one rule如何通过多个规则对 ArrayList 中的对象进行排序
【发布时间】:2019-09-24 01:45:15
【问题描述】:


我有一个 Java ArrayList,其中包含一些 ObjType 类型的对象。

假设对象有两个字段:
- boolean 字段 isManual()
- double 值 getAffinity()

我正在尝试根据多个标准订购此 ArrayList:
-首先所有具有 isManual=true 的对象,其顺序与它们在 ArrayList 中已有的顺序相同
- 然后我想要所有 isManual=false 的对象按 getAffinityValue 排序(从最低到最高)

我想出了这段代码,但它不起作用(似乎是随机排序):

Collections.sort(coda, new Comparator<ObjType>() {

            public int compare(ObjType a, ObjType b) {
                boolean b1=a.isManual();
                boolean b2=b.isManual();
                if(b1 && b2) {
                    if (a.getAffinity() < b.getAffinity()) return 1;
                    if (a.getAffinity() > b.getAffinity()) return -1;
                    return 0;
                }
                if (b1) return -1;
                if (b2) return 1;
                if (a.getAffinity() < b.getAffinity()) return 1;
                if (a.getAffinity() > b.getAffinity()) return -1;
                return 0;
            }
}

有什么建议吗?非常感谢!

【问题讨论】:

  • 嗨@ThomasSallaberger。我也尝试了该解决方案,并提出了一些与我目前拥有的代码类似的代码(稍微长一点)。那对我不起作用
  • 排序两次。在第一种排序中,通过 isManual 重新排序对象。在第二个排序中,忽略 isManual 为 true 的对象并开始排序 isManual 为 false 的对象。
  • 您是否尝试将它们显示在 JTable 或类似文件中?
  • 对不起,我好像误解了你的问题

标签: java sorting arraylist collections


【解决方案1】:

首先所有带有 isManual=true 的对象的顺序与它们相同 已经在 ArrayList

那么在两个对象都有isManual == true的情况下,你不应该返回0以外的任何东西。

然后我希望所有带有 isManual=false 的对象都由 getAffinityValue(从小到大)

然后这些行:

if (a.getAffinity() < b.getAffinity()) return 1;
if (a.getAffinity() > b.getAffinity()) return -1; 

应该返回与它们返回的相反的值。
所以试试这个:

Collections.sort(coda, new Comparator<ObjType>() {
    public int compare(ObjType a, ObjType b) {
        boolean b1=a.isManual();
        boolean b2=b.isManual();

        if(b1 && b2) return 0;
        if (b1) return -1;
        if (b2) return 1;

        Double affinity1 = a.getAffinity();
        Double affinity2 = b.getAffinity();
        return affinity1.compareTo(affinity2);
    }
});

【讨论】:

  • 或单行:coda.sort((a, b) -&gt; a.isManual()? b.isManual()? 0: -1: b.isManual()? +1: Double.compare(a.getAffinity(), b.getAffinity()));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2012-02-03
  • 2013-01-06
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多