2017-03-06 49 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

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