java - 根据唯一值将列表拆分为子列表

标签 java arraylist java-8 classification decision-tree

我有一个列表列表: List<ArrayList<String>> D = new ArrayList<>();

填充后,它可能看起来像:
[“A”、“B”、“Y”]
["C", "D", "Y"]
[“A”、“D”、“N”]

我想根据唯一的属性值(假设索引 1)将列表的列表拆分为多个分区。

所以索引 1 处的属性有两个唯一值,“B”和“D”,所以我想拆分为:
[“A”、“B”、“Y”]

[“C”、“D”、“Y”]
[“A”、“D”、“N”]

然后将它们放入 List<ArrayList<ArrayList<String>>> sublists;

有没有一种聪明的方法可以做到这一点,或者我只是做这样的事情:

List<ArrayList<ArrayList<String>>> sublists = new ArrayList<>();
int featIdx = 1;

// generate the subsets
for (ArrayList<String> record : D) {
    String val = record.get(featIdx);

    // check if the value exists in sublists
    boolean found = false;
    for (ArrayList<ArrayList<String>> entry : sublists) {
        if (entry.get(0).get(featIdx).equals(val)) {
            entry.add(record);
            found = true;
            break;
        }
    }

    if (!found) {
        sublists.add(new ArrayList<>());
        sublists.get(sublists.size()-1).add(record);
    }
}

这是 C4.5 决策树的一个步骤 algorithm ,所以如果有人有这方面的经验,请告诉我这是否是生成子列表的正确方法,我将不胜感激。

谢谢。

最佳答案

在 Java 8 中,您可以使用 groupingBy 收集器:

Map<String, List<List<String>>> grouped = D.stream()
                .collect(Collectors.groupingBy(list -> list.get(1)));
Collection<List<List<String>>> sublists = grouped.values();

或按照@AlexisC 的建议:

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.groupingBy;

Collection<List<List<String>>> sublists = D.stream()
             .collect(collectingAndThen(groupingBy(list -> list.get(1)), Map::values));

关于java - 根据唯一值将列表拆分为子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28993068/

相关文章:

java - 如何从 JAVA 应用程序中获取所有 DNS 条目?

java - 在与 YObjects 的 ArrayList 一起使用的类中使用 Xobjects 的 ArrayList

java - 我需要找到数组中的第一个事件?

Java 8 不兼容类型错误

Java 8 : Syntax for Implementing java. util.function.Function 作为 Lambda 表达式

lambda - 对流的 groupBy 结果应用操作

java - 将 lambda(函数)分配给要在 Java 中作为参数传递的变量

java - Android 10 java 中销毁应用程序后后台服务在 20 秒后停止

java - 选择 Guava Bloom 过滤器使用的哈希函数

java - 将代码从 HashMap 转换为 ArrayList