2016-09-19 159 views
3

我一直在研究一些需要我通过三个属性(name (str)colour (str)volume (int))对对象(软饮料)进行排序的内容。我已经研究过并找到了分别按名称和颜色以及体积排序的方法,但是有没有三种方法可以排列它们?通过多个属性对对象进行排序

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

我在寻找的输出将是:

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

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

+0

提示:今年夏天有一个很好的演示文稿:http:///2016.java-forum-stuttgart.de/_data/D4_Wiedeking.pdf ...在一些箔片上的一些德文文本,但大多数是Java源代码代码示例。这件事需要lambdas和比较的东西...到一个新的水平。 – GhostCat

+0

@GhostCat该链接不适用于我:/它只是带我到主页。 –

+0

将我带到主页,但是如果您有链接,请随时发布。肯定会有兴趣了解比较事情的更多细节:) –

回答

12

尝试这样:

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

记得有你的属性(getNamegetColour等)的干将。这就是你所需要的,不需要任何自定义比较器或任何东西。

+3

最后一个类型是'int',所以你可以使用'thenComparingInt'来避免一些装箱。 –

+0

完美工作。谢谢! –

1

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方法之前,一定要检查空值的值(如有必要)。

相关问题