具有不同排序选项的Java自定义比较器

时间:2013-10-30 16:16:54

标签: java sorting comparator

我有一个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对列表进行排序?

4 个答案:

答案 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)

使用两个独立的比较器。选择要在排序调用中使用的那个。