比较器列出特定项目的字段

时间:2015-09-15 08:52:27

标签: java sorting comparator

我有一个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) ...

喜欢 compare(整数,整数)不是覆盖方法。

3 个答案:

答案 0 :(得分:3)

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。

答案 1 :(得分:3)

您必须使用正确的List<>类型,例如List<Integer>,然后使用Integer应该没问题。这是值得推荐的替代方案。

或者,如果您坚持使用无类型List,则应该

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

代替。第二种替代方案不如另一种方式:你的类型安全性较低,因此无法使用它。

要使用List<OrderType>,您必须完全更改代码,因为您无法做到

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

任何时候(当然)。

此外,比较器应该像

一样使用
    Collections.sort(l, new Comparator<OrderType>() {

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

特别注意

  • 使Comparator<OrderType>的{​​{1}}部分具有正确的参数类型
  • compare()调用使检查更容易(其他示例无法比较相等...)

答案 2 :(得分:2)

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

    Collections.sort(list, new Comparator() {

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

    });

您给出比较器并实现比较方法。该方法采用(List&lt; T&gt;)T参数的两个对象。然后,您可以从每个对象访问属性并进行比较。

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