首页 > 解决方案 > java - 如何在java中找到2D ArrayList的列的唯一值?

问题描述

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Delete
{
    public static void main(String[] args)
    {
         List<List<String>> list = new ArrayList<>();
         list.add(List.of("A","B","C","R"));
         list.add(List.of("E","F","G","F"));
         list.add(List.of("A","B","C","D"));
         System.out.println(list.stream().distinct().count());
         Map<String, Long> countMapOfColumn = list.stream()
                                                  .filter(innerList -> innerList.size() >= 3)
                                                  .map(innerList -> innerList.get(3 - 1))
                         .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        System.out.println(countMapOfColumn.keySet());
    }
}

我想找出第 3 列的唯一元素,哪些是第 3 列"C","G"中的2唯一元素。

这可以使用loop但我不能使用循环来完成。使用javastream可能有一个解决方案。

此外,我如何才能一次获得"A","B"1,2中的行数,并且通常N列中的行数?

标签: javaarraylistlambdajava-8java-stream

解决方案


对于您给定的数据结构;

Map<String, Long> countMapOfColumn = list.stream()
        .filter(innerList -> innerList.size() >= column)
        .map(innerList -> innerList.get(column - 1))
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

其中column = 3, 将为您提供一个{"C", "G"}作为键集的地图,而 values 将为您提供给定列中每个字符的计数。它也适用于非均匀矩阵,因为它只会跳过没有第 n 列的行。

任何列的唯一计数将取决于 collect 方法生成的映射的大小;countMapOfColumn.size()

要获取单个字符计数,请使用带有键的结果映射作为输入,例如获取Cin column = 3、 use的计数countMapOfColumn.get("C"),这将返回2

但我宁愿使用 Guava's Table,您可以直接选择任何给定的行或列而没有任何麻烦,那么它只是获取第 n 列,并过滤我们的重复项。

更新

获取以连续列表开头的行数list = {"A", "B"}

List<String> startingList = Arrays.asList("A", "B");
Long count = list.stream()
        .filter(innerList -> innerList.size() >= startingList.size() 
                && innerList.subList(0, startingList.size()).equals(startingList))
        .count();

推荐阅读