2017-03-06 46 views
-4

我有一個對象列表。每個對象都有兩個屬性。如何創建最大值的收集地圖

  • 名稱
  • idSet

實施例:

1. name = "CH2OH"  idSet = "223" 
2. name = "CH2CH2OH" idSet = "255,310" 
3. name = "CH2OH"  idSet = "223,256" 
4. name = "CH2OH"  idSet = "223,256,295" 

1,3和4具有相同的名字,但不同IDLIST。但是3包含1的idList項+一個新的id,並且4有3的idList +一個新的id。

我想獲得一個列表或流,名稱作爲鍵和idList作爲它的值。然而,IDLIST應該總是得到最大

預期根據例子

- name = "CH2CH2OH"  idSet = "255,310" 
- name = "CH2OH"  idSet = "223,256,295" 

我如何通過使用Java 8.我已經試過this把它弄出來放。但問題在於,只考慮一個屬性,它正在獲得獨特的流。它隨機得到一個並消除其他。我想通過考慮兩個屬性得到流。謝謝

+0

「我怎樣才能通過使用java 8」? ...通過編寫代碼。如果你不知道該怎麼做,那麼去一些教程吧。他們有很多。這個問題要麼不清楚,要麼太寬泛。 – Seelenvirtuose

+0

@Seelenvirtuose:我試過這個[](http://stackoverflow.com/questions/23699371/java-8-distinct-by-property)之一,但問題是它通過考慮只有一個屬性獲得獨特的流。它隨機得到一個並消除其他。我想通過考慮兩個屬性來獲得流。 –

+0

請發佈您的代碼的[MCVE]版本 – c0der

回答

1

嘗試這樣的事情。我在昨天觀看的YT視頻中找到了這個解決方案。轉到大約一點58分30秒

https://www.youtube.com/watch?v=1OpAgZvYXLQ

List<MyObjects> myList = createObjects(); 


Map<String, Optional<String>> myMappedList = myList.stream() 
      .collect(Collectors.groupingBy(MyObjects::getName, 
        Collectors.mapping(MyObjects::getidSet, 
         Collectors.maxBy((a, b) -> a.toString().length() - b.toString().length())))); 

//Here's the output with your example (Using toString override in MyObjects Class): 

System.out.println(myMappedList); 

{CH2OH=Optional[223,256,295], CH2CH2OH=Optional[255,310]} 

通過「最大」時,比較器尋找具有最長的字符串長度idset。

希望這會有所幫助,我認爲這是一個很好的問題。 Venkat Subramaniam認爲它足夠重要,可以談論......

+0

非常感謝您的回答。它的工作。 :D –

+0

太棒了(:很高興它的工作。 –