gpt4 book ai didi

java - 如何对属于两个或多个组的列表中的对象进行分组?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:59 28 4
gpt4 key购买 nike

我有一个项目列表,其中每个项目都可以属于一个或多个类别。对于一组有限的类别(字符串),我想创建一个 map ,其中类别作为键,项目列表作为值。

假设我的 Item 类定义如下:

public static class Item{
long id;
List<String> belongsToCategories;

public List<String> getBelongsToCategories() {
return belongsToCategories;
}

public void setBelongsToCategories(List<String> belongsToCategories) {
this.belongsToCategories = belongsToCategories;
}

public Item(long id,List<String> belongsToCategories) {
this.id = id;
this.belongsToCategories = belongsToCategories;
}

@Override
public String toString() {
return "Item{" + "id=" + id + '}';
}
}

和项目列表:

public static void main(String[] args) {
List<Item> myItemList = new ArrayList<>();

myItemList.add(new Item(1,Arrays.asList("A","B")));
myItemList.add(new Item(2,Arrays.asList("A","C")));
myItemList.add(new Item(3,Arrays.asList("B","C")));
myItemList.add(new Item(4,Arrays.asList("D")));
myItemList.add(new Item(5,Arrays.asList("D","E")));
myItemList.add(new Item(6,Arrays.asList("A","F")));

Map<String,List<Item>> myMap= new HashMap<>();

如何从 myList 填充 myMap?

我认为 Stream API 可以提供帮助,但我不知道当一个 Item 可以属于一个或多个类别时将哪个分类器放入 groupingBy 方法中

 myItemList.stream().collect(Collectors.groupingBy(classifier));

这个

myItemList.stream().collect(Collectors.groupingBy(Item::getBelongsToCategories));

产生

[D, E]=[Item{id=5}]
[B, C]=[Item{id=3}]
[A, B]=[Item{id=1}]
[D]=[Item{id=4}]
[A, C]=[Item{id=2}]
[A, F]=[Item{id=6}]

预期是艰难的,例如:

A=[Item{id=1}, Item{id=2}, Item{id=6}]
B=[Item{id=1}, Item{id=3}]
C=[Item{id=2}, Item{id=3}]
D=[Item{id=4}, Item{id=5}]
E=[Item{id=5}]
F=[Item{id=6}]

最佳答案

您可以使用 Eclipse Collections 中的 groupByEach .

Multimap<String, Item> itemsByCategory =
ListIterate.groupByEach(myItemList, Item::getBelongsToCategories);

System.out.println(itemsByCategory);

输出:

{D=[Item{id=4}, Item{id=5}], 
E=[Item{id=5}],
F=[Item{id=6}],
A=[Item{id=1}, Item{id=2}, Item{id=6}],
B=[Item{id=1}, Item{id=3}],
C=[Item{id=2}, Item{id=3}]}

您还可以将 Collectors2 实用程序类和 groupByEach 收集器与 Java Stream 一起使用。

Multimap<String, Item> itemsByCategory = myItemList.stream().collect(
Collectors2.groupByEach(
Item::getBelongsToCategories,
Multimaps.mutable.list::empty));

注意:我是 Eclipse Collections 的提交者。

关于java - 如何对属于两个或多个组的列表中的对象进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55376332/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com