按多个属性对对象排序

  • 本文关键字:对象 排序 属性 java
  • 更新时间 :
  • 英文 :


我一直在研究一些需要我按三个属性- name (str), colour (str)volume (int)对对象(软饮料)进行排序的东西。我研究了一下,找到了按名称、颜色和体积分别订购它们的方法,但有没有一种方法可以同时按这三种方式订购呢?

我的意思是:例如,假设有四个软饮料对象:芬达橙色500,可乐红色500,可乐银色500,芬达橙色400。

我正在寻找的输出将是:

  • 1)可乐红500
  • 2)焦银500
  • 3)芬达橙400
  • 4)芬达橙500

先按名称排序,然后是颜色,然后是音量(升序)。

我目前使用三个比较器:nameComparator, colourComparatorvolumeComparator,但它们每个只按名称排序对象,然后只按颜色,然后只按体积。是否可以根据比较器的多个属性进行排序?

试试这样:

drinks.sort(
      Comparator.comparing(Drink::getName).thenComparing(Drink::getColour).thenComparing(Drink::getVolume)
    );

请记住为您的属性(getName, getColour等)提供getter。这就是您所需要的,不需要任何自定义比较器或任何东西。

Alex!

回答您关于使用比较器按多个属性排序实体的问题,这里是java对象排序教程的链接:https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

特别是有一个比较器的例子,它首先按日期比较对象,然后(如果相等)按数字比较它们:

static final Comparator<Employee> SENIORITY_ORDER = 
                                        new Comparator<Employee>() {
    public int compare(Employee e1, Employee e2) {
        int dateCmp = e2.hireDate().compareTo(e1.hireDate());
        if (dateCmp != 0)
            return dateCmp;
        return (e1.number() < e2.number() ? -1 :
               (e1.number() == e2.number() ? 0 : 1));
    }
};

很容易将此模式应用到您的案例中:

static final Comparator<SoftDrink> DRINKS_ORDER = new Comparator<SoftDrink>() {
    public int compare(SoftDrink d1, SoftDrink d2) {
        int nameCmp = d1.getName().compareTo(d2.getName());
        if (nameCmp != 0) {
            return nameCmp;
        }
        int colorCmp = d1.getColor().compareTo(d2.getColor());
        if (colorCmp != 0) {
            return colorCmp;
        }
        return d1.getVolume() < d2.getVolume() ? -1 : (d1.getVolume() == d2.getVolume() ? 0 : 1);
    }
};

在调用compareTo方法之前,请确保检查值是否为空(如果有必要)。

最新更新