【问题标题】:HashMap<Key,List<Object>> from list of objects containing same propertyHashMap<Key,List<Object>> 来自包含相同属性的对象列表
【发布时间】:2015-10-09 22:28:29
【问题描述】:

我有一个对象列表。

例如>

对象 1

groupId=1 姓名=姓名1

对象 2

groupId=1 名称=名称2

对象 3

groupId=1 名称=名称3

对象 4

groupId=2 名称=名称4

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

我最初的想法是创建一个HashMap&lt;Integer,List&lt;Object&gt;&gt;,但我不确定groupIds 的不确定值是否会出现,这反过来又让我不确定如何将具有相同groupIdsgroupId 的对象分组为hashmap 的键。

如果将来 groupId 不改变或增加,我可以遍历原始列表并编写 switch 语句来创建所需的数组。

【问题讨论】:

    标签: java android list hashmap


    【解决方案1】:

    对于 Java 8,您可以使用 the groupingBy collector:

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

    【讨论】:

    • 我需要这个用于 android,所以 java 8 不是一个选项。很好的解决方案,不过谢谢!
    【解决方案2】:

    我是这样做的。我使用了LinkedHashMap&lt;K,V&gt;,因为我必须保留我根据对象的优先级值属性排序的对象的顺序。

        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);
            }
    

    【讨论】:

      【解决方案3】:

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

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

      其中HashMap 中的keyInteger 代表HashMapgroupId(即- 1、2、3 等)和value(即-name1、name2 等)存储在StringList

      您可以使用以下步骤 -

      1. 遍历您的四个列表。
      2. 将每个项目添加到基于 Map 的构造(例如,此处为 map)关键组 ID。

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

      【讨论】:

      • 这是我想到的第一件事,但我不确定从数据源传入的组数。如果我确定组数,那将不是问题。
      【解决方案4】:

      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());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 2017-03-05
        • 2014-01-04
        • 2022-01-18
        相关资源
        最近更新 更多