代码之家  ›  专栏  ›  技术社区  ›  pushkin

基于唯一值将列表拆分为子列表

  •  4
  • pushkin  · 技术社区  · 9 年前

    我有一个列表: 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 ,因此,如果有人有这方面的经验,如果您能告诉我这是否是生成子列表的正确方法,我将不胜感激。

    非常感谢。

    2 回复  |  直到 9 年前
        1
  •  7
  •   assylias    9 年前

    使用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));
    
        2
  •  3
  •   Rohit Jain    9 年前

    我建议创建一个 HashMap<String, List<List<String>>> ,并将这些列表分组。那就打电话 map.values() 得到 Collection<List<List<String>>> .

    List<List<String>> list = new ArrayList<>();
    list.add(Lists.newArrayList("A", "B", "Y"));
    list.add(Lists.newArrayList("C", "D", "Z"));
    list.add(Lists.newArrayList("A", "D", "X"));
    list.add(Lists.newArrayList("D", "C", "A"));
    
    Map<String, List<List<String>>> mapped = list.stream()
                    .collect(Collectors.groupingBy(li -> li.get(1))); 
    System.out.println(mapped);
    Collection<List<List<String>>> groupedList = mapped.values();