如何合并重复的属性值并对它们的其他属性求和 – Java

huangapple go评论120阅读模式
英文:

How to merge duplicated property value and sum their other property - java

问题

以下是翻译好的部分:

  1. public class ContrastItem {
  2. private String range;
  3. private Long contrast;
  4. }

期望的结果:

  1. [{
  2. "contrast": 4,
  3. "range": "00:00:00-00:59:59"
  4. },
  5. {
  6. "contrast": 0,
  7. "range": "01:00:00-01:59:59"
  8. }]

我尝试使用流进行映射,使用groupby和summingLong,但无法理解如何解决它(不知道我在做什么):

  1. mylist.stream()
  2. .collect(Collectors.groupingBy(
  3. ContrastItem::getRange, Collectors.summingLong(ContrastItem::getContrast)))
  4. .entrySet().stream().map().collect(Collectors.toList());
英文:

I have list of this object, wanted to sum duplicated item's contrast and remove duplicates.

  1. public class ContrastItem {
  2. private String range;
  3. private Long contrast;
  4. }
  1. [{
  2. "contrast": 3,
  3. "range": "00:00:00-00:59:59"
  4. },
  5. {
  6. "contrast": 1,
  7. "range": "00:00:00-00:59:59"
  8. },
  9. {
  10. "contrast": 0,
  11. "range": "01:00:00-01:59:59"
  12. },
  13. {
  14. "contrast": 0,
  15. "range": "01:00:00-01:59:59"
  16. }]

Expected:

  1. [{
  2. "contrast": 4,
  3. "range": "00:00:00-00:59:59"
  4. },
  5. {
  6. "contrast": 0,
  7. "range": "01:00:00-01:59:59"
  8. }]

I have tried stream mapping the list with groupby and summingLong but could't wrap around my head to solve it.(don't know what i'm doing)

  1. mylist.stream()
  2. .collect(Collectors.groupingBy(
  3. ContrastItem::getRange,Collectors.summingLong(ContrastItem::getContrast)))
  4. .entrySet().stream().map().collect(Collectors.toList());

答案1

得分: 0

您的方法非常接近,

  1. itemList.stream()
  2. .collect(Collectors.groupingBy(
  3. ContrastItem::getRange,
  4. Collectors.summingLong(ContrastItem::getContrast)
  5. ));

这段代码创建了一个映射 {01:00:00-01:59:59=0, 00:00:00-00:59:59=4}

然后您需要将其转换为 ContrastItem 列表:

  1. public static void main(String[] args) {
  2. List<ContrastItem> itemList = new ArrayList<>();
  3. itemList.add(new ContrastItem("00:00:00-00:59:59", 3L));
  4. itemList.add(new ContrastItem("00:00:00-00:59:59", 1L));
  5. itemList.add(new ContrastItem("01:00:00-01:59:59", 0L));
  6. itemList.add(new ContrastItem("01:00:00-01:59:59", 0L));
  7. List<ContrastItem> collect = itemList.stream()
  8. .collect(Collectors.groupingBy(
  9. ContrastItem::getRange,
  10. Collectors.summingLong(ContrastItem::getContrast)))
  11. .entrySet().stream()
  12. .map(entry -> new ContrastItem(entry.getKey(), entry.getValue()))
  13. .collect(Collectors.toList());
  14. System.out.println(collect);
  15. }
英文:

Your approach is quite close,

  1. itemList.stream()
  2. .collect(Collectors.groupingBy
  3. (
  4. ContrastItem::getRange,
  5. Collectors.summingLong(ContrastItem::getContrast)
  6. ));

this code creates a map {01:00:00-01:59:59=0, 00:00:00-00:59:59=4}

then you need to convert to ContrastItem list

  1. public static void main(String[] args) {
  2. List&lt;ContrastItem&gt; itemList = new ArrayList&lt;&gt;();
  3. itemList.add(new ContrastItem(&quot;00:00:00-00:59:59&quot;, 3L));
  4. itemList.add(new ContrastItem(&quot;00:00:00-00:59:59&quot;, 1L));
  5. itemList.add(new ContrastItem(&quot;01:00:00-01:59:59&quot;, 0L));
  6. itemList.add(new ContrastItem(&quot;01:00:00-01:59:59&quot;, 0L));
  7. List&lt;ContrastItem&gt; collect = itemList.stream()
  8. .collect(Collectors.groupingBy(
  9. ContrastItem::getRange,
  10. Collectors.summingLong(ContrastItem::getContrast)))
  11. .entrySet().stream()
  12. .map(entry -&gt; new ContrastItem(entry.getKey(), entry.getValue()))
  13. .collect(Collectors.toList());
  14. System.out.println(collect);
  15. }

答案2

得分: 0

你绝对可以使用Stream来实现,看起来并不是很复杂。groupingBy + reducing是你需要的。

  1. Collection&lt;ContrastItem&gt; items = contrastItems.stream()
  2. .collect(Collectors.groupingBy(
  3. ContrastItem::getRange,
  4. Collectors.reducing(new ContrastItem(0L, &quot;&quot;),
  5. (one, two) -&gt; new ContrastItem(one.getContrast() + two.getContrast(),
  6. two.getRange()))))
  7. .values();
英文:

You can definitely do it with Stream and it looks not very complicated. groupingBy + reducing is what you need.

  1. Collection&lt;ContrastItem&gt; items = contrastItems.stream()
  2. .collect(Collectors.groupingBy(
  3. ContrastItem::getRange,
  4. Collectors.reducing(new ContrastItem(0L, &quot;&quot;),
  5. (one, two) -&gt; new ContrastItem(one.getContrast() + two.getContrast(),
  6. two.getRange()))))
  7. .values();

huangapple
  • 本文由 发表于 2023年8月10日 15:39:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/76873558.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定