2017-07-26 71 views
0

嗨,我有3個收藏, 第一個我想要按名稱排序,第二個電子郵件,然後是最後一個我想排序的年齡。 我的問題是使用集合的工作?收藏排序Java

,如果我這樣做在SQL像

sort by name,email,age 

我知道它的工作嗎?

我試着用java這樣做。

Collections.sort(listPeople, new Comparator<People>() { 
    @Override 
    public int compare(final People o1, final People o2) { 
     return o1.getName().compareTo(o2.getName()); 
    } 
}); 

//then 

Collections.sort(listPeople, new Comparator<People>() { 
    @Override 
    public int compare(final People o1, final People o2) { 
     return o1.getEmail().compareTo(o2.getEmail()); 
    } 
}); 

//and then 

Collections.sort(listPeople, new Comparator<People>() { 
    @Override 
    public int compare(final People o1, final People o2) { 
     return o1.getAge().compareTo(o2.getAge()); 
    } 
}); 

它的工作原理?或每個集合覆蓋以前?

+1

爲什麼不嘗試運行它,並告訴我們它是否可以運行 – victor

+0

類應該以單個實例命名。如果您的班級實例代表一個人,請將其命名爲「人」,而不是「人」。 – shmosel

+3

你的問題有點矛盾。 SQL按名稱,電子郵件,年齡排序(實際上,「按順序排列」)對多個字段中的一組行進行排序。但是接下來你會討論3個集合,每個集合都在一個字段上排序。然後,您的代碼將一個集合排序3次。請澄清。 – Arkadiy

回答

4

如果您先後排序同一集合比操作將覆蓋其他的影響排序操作。


你想要什麼可以通過調整你的自定義比較器來完成。首先比較名稱,如果元素相等,則比較電子郵件地址,如果再次相等,則比較年齡

看看這個代碼片段:

Collections.sort(listPeople, new Comparator<People>() { 
    @Override 
    public int compare(final People o1, final People o2) { 
     int nameOrder = o1.getName().compareTo(o2.getName()); 
     if (nameOrder != 0) { 
      return nameOrder; 
     } 

     // Elements names are equal, compare by their email 
     int emailOrder = o1.getEmail().compareTo(o2.getEmail()); 
     if (emailOrder != 0) { 
      return emailOrder ; 
     } 

     // Elements emails are equal, compare by their age 
     int ageOrder = o1.getAge().compareTo(o2.getAge()); 
     // Return that in any case as we do not have another sorting criteria 
     return ageOrder; 
    } 
}); 

由於的Java 8就可以達到同樣的用更少的代碼(見@Eugene答案):

Comparator.comparing(People::getName) 
    .thenComparing(People::getEmail) 
    .thenComparing(People::getAge)); 

這將創建與上面解釋的相同的比較器。

6

如果我得到了它是正確的,你應該使用java-8的功能在這裏...

Collections.sort(listPeople, Comparator.comparing(People::getName) 
        .thenComparing(People::getEmail) 
        .thenComparing(People::getAge)); 
+0

儘管這段代碼確實解決了OP的問題,但並未解釋它的工作原理。對我來說,這聽起來像OP與一些基礎知識的鬥爭,可能的解釋有助於更多地瞭解事情的工作原理,只是發佈一些有用的技巧。 – Zabuza

+0

@ Zabuza ...這就是你的答案確實如此。特別是因爲這是用'java-8'標記的,我假設*用戶能夠閱讀這個「魔術代碼」。嘿,我給你的答案btw一個加號,所以thx填補他的差距;) – Eugene

+0

哦,沒有看到'java-8'標籤,那麼我肯定撤回我的反對:) – Zabuza