我有一个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(整数,整数)不是覆盖方法。
答案 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参数的两个对象。然后,您可以从每个对象访问属性并进行比较。
考虑设置对象列表的通用类型。