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

相關問題