繁体   English   中英

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

[英]Java custom comparator with different sort options

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

经过一些修改,是的。

添加带有枚举参数的构造函数以定义要使用的字段:

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;
}

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

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

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

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

该比较器可用于任何类别。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM