HashMap的<键,列表<对象>&GT;来自包含相同属性

时间:2015-07-20 17:24:09

标签: java android list hashmap

我有一个对象列表。

例如&GT;

对象1

的groupId = 1 命名= NAME1

对象2

的groupId = 1 命名= NAME2

对象3

的groupId = 1 命名= NAME3

对象4

的groupId = 2 命名= NAME4

List中的多个对象具有groupId的相同值。我需要创建具有相同groupId的对象的子列表。我如何用Java做到这一点。

我的初学者想法是创建HashMap<Integer,List<Object>>,但我不确定groupIds的无限期值,这反过来让我不确定如何将具有相同groupIds的对象组合在一起使用groupId作为hashmap的密钥。

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

4 个答案:

答案 0 :(得分:6)

使用Java 8,您可以使用the groupingBy collector

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

答案 1 :(得分:2)

我是这样做的。我使用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);
        }

答案 2 :(得分:1)

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

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

key中的HashMap Integer代表您的groupId(即 - 1,2,3等)和value(即 - 存储在HashMap List String的{​​{1}}的name1,name2等)。

您可以使用以下步骤 -

1。:对您的四个列表进行迭代 2. :根据键groupId将每个项目添加到Map构造(例如,此处map)。

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

答案 3 :(得分:1)

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

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

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

使用Collections 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());