【问题标题】:Group list elements in list of list in java在java中的列表列表中分组列表元素
【发布时间】:2018-10-22 08:47:49
【问题描述】:

我有一个元素列表。我想根据某些条件将此列表的元素分组到列表列表中。是否可以在 java 中轻松完成?

public class CollectionTest {

    public static void main(String[] arg) {
        Target target0 = new Target();
        target0.setRisklevel("III");
        target0.setLocation("Combined");
        Target target1 = new Target();
        target1.setRisklevel("III");
        target1.setLocation("Combined");
        Target target2 = new Target();
        target2.setRisklevel("III");
        target2.setLocation("Combined");
        Target target3 = new Target();
        target3.setRisklevel("III");
        target3.setLocation("Combined");
        Target target4 = new Target();
        target4.setRisklevel("IV");
        target4.setLocation("Combined");
        Target target5 = new Target();
        target5.setRisklevel("IV");
        target5.setLocation("Combined");
        Target target6 = new Target();
        target6.setRisklevel("IV");
        target6.setLocation("Combined");
        Target target7 = new Target();
        target7.setRisklevel("II");
        target7.setLocation("Domestic");
        Target target8 = new Target();
        target8.setRisklevel("IV");
        target8.setLocation("Domestic");
        Target target9 = new Target();
        target9.setRisklevel("IV");
        target9.setLocation("Domestic");
        Target target10 = new Target();
        target10.setRisklevel("IV");
        target10.setLocation("Domestic");
        Target target11 = new Target();
        target11.setRisklevel("IV");
        target11.setLocation("Domestic");

        List<Target> ucrtargetList = new ArrayList<Target>();
        ucrtargetList.add(target0);
        ucrtargetList.add(target1);
        ucrtargetList.add(target2);
        ucrtargetList.add(target3);
        ucrtargetList.add(target4);
        ucrtargetList.add(target5);
        ucrtargetList.add(target6);
        ucrtargetList.add(target7);
        ucrtargetList.add(target8);
        ucrtargetList.add(target9);
        ucrtargetList.add(target10);
        ucrtargetList.add(target11);
        List<List<Target>> fullList = new ArrayList<List<Target>>();
    }
}

这里的条件是风险级别,并且列表列表中的每个列表中的位置必须相同。所以 fullList 里面应该有 4 个列表(1st III & Combined,2nd IV & Combined,3rd II & Domestic,4th IV & Domestic)。

我可以遍历列表并设置值。有没有更简单的方法可以用 java8 或 apache commons 做到这一点?

【问题讨论】:

标签: java list arraylist collections


【解决方案1】:

尚无法发表评论,因此添加一个答案,以扩展 @Schidu Luca 已回复的内容,“groupingBy”子句可以像这样链接起来

Map<String, List<Target>> collect = ucrtargetList.stream()
           .collect(Collectors.groupingBy(Target::getRisklevel, Collectors.groupingBy(Target::getLocation)));

【讨论】:

  • 现在这将返回一个风险级别的键和作为哈希映射的值,它再次将键作为位置。有什么简单的方法可以从此哈希图中获取列表列表?
  • 这在@Holger [link]stackoverflow.com/questions/38360276/…的回答中得到了很好的解释
【解决方案2】:

根据您的描述fullList 中应该有 4 个列表(1st III & Combined、2nd IV & Combined、3rd II & Domestic、4th IV & Domestic) 我假设您正在寻找这个:

Function<Target, List<String>> riskLevelAndLocation = t -> List.of(t.getRiskLevel(), t.getLocation());
Map<List<String>, List<Target>> fullList = ucrtargetList.stream()
        .collect(Collectors.groupingBy(riskLevelAndLocation));

riskLevelAndLocation 是一个Function,它返回一个包含riskLevellocationListgroupingBy List 有效,因为 List.equals(Object o)

返回true当且仅当指定的对象也是一个列表,两者 列表具有相同的大小,并且所有对应的元素对在 这两个列表相等

快速检查:

for (Entry<List<String>, List<Target>> entrySet : fullList.entrySet()) {
    System.out.println(entrySet.getKey().toString() + ": " + entrySet.getValue().size());
}

输出是:

[IV, Combined]: 3
[II, Domestic]: 1
[III, Combined]: 4
[IV, Domestic]: 4

如果fullList 必须具有您描述的顺序,那么您可以使用LinkedHashMap 并对其进行排序。

【讨论】:

  • 这可行,但这似乎正在使用 java10 功能。我需要 java 8 中的解决方案或使用 Apache Commons 等外部库。
  • Java 9 代码是List.of。您可以改用Arrays.asList
【解决方案3】:
List<List<Target>> fullList = ucrtargetList.stream()
                .collect(Collectors.groupingBy(Target::getRisklevel)) // Or another collector
                .entrySet()
                .stream()
                .map(Map.Entry::getValue)
                .collect(Collectors.toList());

如果要从结果中删除相同的对象,则需要添加方法 'equals' 和 'hashcode' 并收集到 Set。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 2021-03-02
    • 2019-09-21
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多