我有一个Item类,它有两个属性--id和timestamp。有一个自定义比较器类,用于根据时间戳对itemList进行排序。
有没有办法使用比较器类,以便我可以指定按时间戳排序或按ID排序?
项目类:
public class Item {
private Integer id;
private Date timestamp;
}
比较者:
public class ItemComparator implements Comparator<Item>{
@Override
public int compare(Item mdi1, Item mdi2) {
return mdi1.getTimestamp().compareTo(mdi2.getTimestamp());
}
}
排序代码:
Collections.sort(itemList, new ItemComparator());
我是否可以使用相同的比较器按Id对列表进行排序?
答案 0 :(得分:3)
经过一些修改,是的。
添加带有枚举参数的构造函数以定义要使用的字段:
public class ItemComparator implements Comparator<Item>{
public enum Field {
ID, TIMESTAMP;
}
private Field field;
public ItemComparator(Field field) {
this.field = field;
}
然后在比较方法中,选择字段switch
:
@Override
public int compare(Item mdi1, Item mdi2) {
int comparison = 0;
switch(field) {
case TIMESTAMP:
comparison = mdi1.getTimestamp().compareTo(mdi2.getTimestamp());
case ID:
comparison = mdi1.getID() - mdi2.getID();
}
return comparison;
}
答案 1 :(得分:2)
我是否可以使用相同的比较器按Id对列表进行排序?
那么你可以有一个构造函数参数来说明你想要排序的属性 - 但我个人会为此创建一个不同的类。你可以拥有尽可能多的实现Comparator<Item>
的类......
答案 2 :(得分:1)
您可以使用Bean Comparator。然后你可以对你班上的任何财产进行排序。您只需指定要用于获取要排序的属性的方法名称。例如:
BeanComparator byId = new BeanComparator(Item.class, "getId");
Collections.sort(items, byId);
此比较器可用于任何类别。
答案 3 :(得分:0)
使用两个独立的比较器。选择要在排序调用中使用的那个。