【问题标题】:Comparator for list on a specific item's field特定项目字段列表的比较器
【发布时间】:2015-09-15 08:52:26
【问题描述】:

我有一个 List 元素。

每个 OrderType 项都有一个整数字段,priority,用于设置列表重新排列的优先级(1、2 或 3)。

我想创建一个比较器,将列表从优先级 1 重新排列到 3。我可以使用 Collections.sort 方法吗?

我看到了这个例子:

package com.javacodegeeks.example;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SimpleSortExample {

    public static void main(String[] args) {
        List list = new ArrayList();

        for (int i=0;i<10;i++) {
            list.add((int) (Math.random() * 100));
        }

        System.out.println("Initial List: "+list);
        Collections.sort(list);
        System.out.println("Sorted List: "+list);

    }

}

有一些例子here

我该怎么做?

我试过了:

Collections.sort(list, new Comparator() {

        @Override
        public int compare(Integer i1, Integer i2) {
            return (i2.intValue() > i1.intValue()) ? 1 : -1;
        }

    });

但我得到一个错误,我必须实现 not ovveride 方法 compare(object, Object)...

Like compare(Integer, Integer) 不是覆盖方法。

【问题讨论】:

  • 你试过第二个例子了吗?
  • 是的,但我不明白如何仅在整数字段优先级上使用它....对答案有帮助吗?
  • 使用 List 列表而不是 List 列表
  • 我不想提取整数字段!我想比较 OrderType 项目的优先级

标签: java sorting comparator


【解决方案1】:

您必须使用正确的List&lt;&gt; 类型,例如List&lt;Integer&gt;,然后使用Integer 应该没问题。这是建议的替代方案。

或者,如果你坚持使用无类型的List,你应该这样做

    @Override
    public int compare(Object i1, Object i2) {
        ...
    }

相反。第二种选择不如另一种:您的类型安全性较低,并且必须四处寻找才能使用它。


要使用List&lt;OrderType&gt;,您必须完全更改您的代码,因为您不能这样做

    for (int i=0;i<10;i++) {
        list.add((int) (Math.random() * 100));
    }

再(当然)。

另外,Comparator 应该像这样使用

    Collections.sort(l, new Comparator<OrderType>() {

        @Override
        public int compare(OrderType o1, OrderType o2) {
            return Integer.compare(oT1.getPriority(), oT2.getPriority());
        }
    });

特别注意

  • 使compare() 具有正确参数类型的Comparator&lt;OrderType&gt; 部分
  • Integer.compare() 调用使检查更容易(其他示例无法比较相等性...)

【讨论】:

  • 我想使用 List 但按优先级整数字段排序
  • 太棒了!真的是我想要的!谢谢!
【解决方案2】:
public class OrderTypeModel implements Comparable<OrderTypeModel> {

private Integer priority;
    @Override
    public int compareTo(OrderTypeModel o) {

        return priority.compareTo(o.priority);
    }
}

您可以简单地实现 Comparable 并在您的 OrderTypeModel arrayList 上调用 Collections.sort。

【讨论】:

    【解决方案3】:

    使用你给我们的第二个例子

        Collections.sort(list, new Comparator() {
    
            @Override
            public int compare(OrderType oT1, OrderType oT2) {
                return (oT1.getPriority() > oT2.getPriority()) ? 1 : -1;
            }
    
        });
    

    你给一个比较器,然后实现 compare 方法。此方法采用 (List) T 参数的两个对象。然后您可以访问每个对象的属性并进行比较。

    考虑设置对象列表的通用类型。

    【讨论】:

    • ... 或者只是,如果使用 Java 8,可读性更好Collections.sort(list, (OrderType oT1, OrderType oT2) -&gt; (oT1.getPriority() &gt; oT2.getPriority()) ? 1 : -1);
    • ... 命名为 lambda 表达式。感谢 glglgl 使用更新的功能完成此任务。
    • 不,我不使用 Java 8。我有 7 版本。
    • 如果我使用@RPresle 解决方案,我会收到此错误:类型 new Comparator(){} 必须实现继承的抽象方法 Comparator.compare(Object, Object)。 new Comparator(){} 类型的方法 compare(OrderTypeModel, OrderTypeModel) 必须重写或实现超类型方法
    • 正如我在答案中所说,考虑设置列表的类型。 List&lt; OrderTypeModel &gt; = new ArrayList&lt; &gt;()
    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 2020-02-06
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多