如何在Java中查找2D ArrayList的一列的唯一值?

5
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());
    }
}

我想找到第三列中唯一的元素,它们是"C""G",并且第三列有2个唯一元素。

这可以使用loop来完成,但我不能使用loop。使用java的stream可能会有解决方案。

另外,如何获取同时在第1,2列中具有"A""B"的行数,并且对于N列通用?

2个回答

8
针对您提供的数据结构;
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"} 为键集的映射表,而值则给出了给定列中每个字符的计数。它也适用于非均匀矩阵,因为它只会跳过没有第n列的行。

任何一列的唯一计数都是 collect 方法返回的结果映射表的大小; countMapOfColumn.size()

要获取单个字符计数,请使用具有输入键的结果映射表,例如要获取 column = 3C 的计数,请使用 countMapOfColumn.get("C"),它将返回 2

但我更愿意使用 Guava 的 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();

2

您的问题不可编译。假设您已按以下方式定义了列表,您可以通过使用以下方法轻松找到第3列中的唯一值。这里我们只是映射了第三列(使用索引2),然后在结果流上应用.distinct()

List<List<String>> list = Arrays.asList(Arrays.asList("A", "B", "C"), 
                                        Arrays.asList("E", "F", "G"),
                                        Arrays.asList("A", "B", "C"));

List<String> distinct = list.stream().map(a -> a.get(2))
                            .distinct().collect(Collectors.toList());

当您打印出元素时,它将输出:
C G
您可以使用相同的逻辑来查找第3列中“C”的计数,使用相同的逻辑。
list.stream().map(a -> a.get(2)).filter(i -> i.contains("C")).count();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接