HashMap<Key,List<Object>> 来自包含相同 属性 的对象列表

HashMap<Key,List<Object>> from list of objects containing same property

我有一个对象列表。

例>

对象 1

groupId=1 姓名=姓名1

对象 2

groupId=1 姓名=姓名2

对象 3

groupId=1 姓名=姓名3

对象 4

groupId=2 姓名=姓名4

列表中的多个对象具有相同的 groupId 值。我需要创建具有相同 groupId 的对象的子列表。我如何在 Java.

中执行此操作

我最初的想法是创建一个 HashMap<Integer,List<Object>> 但我不确定 groupIds 的不确定值是否会进来,这反过来又让我不确定如何将具有相同 [=15= 的对象分组] 连同 groupId 作为哈希映射的键。

如果 groupId 将来不会更改或增加,我可以迭代原始列表并编写一个 switch 语句来创建所需的数组。

我认为您需要这样的地图 -

Map map = new HashMap<Integer, List<String>>();  

其中 HashMap 中的 keyInteger 代表您的 groupId(即 - 1、2、3 等)和 value(即 - HashMap 的名称 1、名称 2 等)存储在 StringList 中。

您可以使用以下步骤 -

1. 遍历你的四个列表。
2. 将每个项目添加到一个 Map 构造(例如 - 这里 map)基于关键 groupId。

我认为 this link 在这种情况下会有所帮助。

Java 8中你可以使用一些过滤器。

public class A {
    public int groupId;
    public String name;

    public A(int groupId, String name) {
        this.groupId = groupId;
        this.name = name;
    }
}

使用集合过滤 API

ArrayList<A> list=new ArrayList();
list.add(new A(2, "tom"));
list.add(new A(2, "rome"));
list.add(new A(1, "sam"));

List<A> filteredlist = list.stream().filter(p -> p.groupId==2).collect(Collectors.toList());

使用 Java 8 你可以使用 the groupingBy collector:

Map<String, List<MyObject>> map = list.stream()
               .collect(Collectors.groupingBy(MyObject::getGroupId));

我是这样做的。我使用 LinkedHashMap<K,V> 因为我必须保留我根据对象的优先级值 属性.

排序的对象的顺序
    LinkedHashMap<Group, List<Object>> hashMap=new LinkedHashMap<Group, List<Object>>();        

    for(Object model:objects){

            if(!hashMap.containsKey(model.getGroup())){
            List<Object> list= new ArrayList<Object>();
            list.add(model);
            hashMap.put(Group,list);
        }
        else{
            hashMap.get(model.getGroup()).add(model);
        }