从母列表生成子列表

时间:2018-01-05 11:51:29

标签: java algorithm sorting arraylist

我在输入中有一个N个对象的列表,我想在子列表中对同一个族的对象进行分组。同一系列中的对象共享属性“File_identifier”。最后,我想通过一个键来访问这些子列表,该键是子列表中某个对象的属性。

SentinelReportModels是父列表

HashMap<String, List<SentinelReportModel>> hashmap = new HashMap<String, List<SentinelReportModel>>();
    for (int i = 0; i < sentinelReportModels.size(); i++) {
        for (int k = 0; k < sentinelReportModels.size(); k++) {
            if (sentinelReportModels.get(i).getIdentifiantfichier()
                    .equals(sentinelReportModels.get(k).getIdentifiantfichier()) ) {
                ArrayList<SentinelReportModel> listeTemp = new ArrayList<>();
                listeTemp.add(sentinelReportModels.get(i));
                listeTemp.add(sentinelReportModels.get(k));

                hashmap.put(sentinelReportModels.get(i).getTypeflux(),listeTemp);
            }
        }

    }

但是它不起作用,我得到带有重复项的X列表。

2 个答案:

答案 0 :(得分:2)

我相信下面的代码应该可以解决问题。基本上,将所有的哨兵放在一个列表中。如果flux id不同,则会向地图添加新列表。

HashMap<String, List<SentinelReportModel>> hashmap = new HashMap<String, List<SentinelReportModel>>();


hashmap.put(,listeTemp);

for (int i = 0; i < sentinelReportModels.size(); i++) {
    if (hashMap.get(sentinelReportModels.get(i).getTypeflux())==null) {


ArrayList<SentinelReportModel> list = new ArrayList<SentinelReportModel>();
  list.add(sentinelReportModels.get(i));
hashMap.put(sentinelReportModels.get(i).getTypeflux(),list);
        }else {             hashMap.get(sentinelReportModels.get(i).getTypeflux()).add(sentinelReportModels.get(i));
        }
}

答案 1 :(得分:1)

使用标准流很容易实现:

可以使用组获取子组列表:

Map<String, List<SentinelReportModel>> map = 
    sentinelReportModels.stream().collect(
        Collectors.groupingBy(model -> model.getIdentifiantfichier()));

这会为您提供<identifiantfichier, List<SentinelReportModel>>

的地图

这可以正常处理为字符串/列表映射。

你的内部循环有一个缺陷,因为它没有考虑到先前的迭代可能已经为当前元素的identifiantfichier创建了一个列表并且无论如何都会覆盖它。