3

我有一个 Item 类,它有两个属性——id 和时间戳。有一个自定义比较器类可以根据时间戳对 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

4 回答 4

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;
}
于 2013-10-30T16:22:47.513 回答
2

我也可以使用相同的比较器按 Id 对列表进行排序吗?

好吧,您可以有一个构造函数参数来说明您想要排序的属性 - 但我个人会为此创建一个不同的类。您可以根据需要实现任意数量的类Comparator<Item>...

于 2013-10-30T16:18:46.300 回答
1

您可以使用Bean Comparator。然后,您可以对班级中的任何属性进行排序。您只需指定要用于获取要排序的属性的方法名称。例如:

BeanComparator byId = new BeanComparator(Item.class, "getId");
Collections.sort(items, byId);

此比较器可用于任何类。

于 2013-10-30T16:37:05.770 回答
0

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

于 2013-10-30T16:19:42.953 回答