【问题标题】:How to find unique value of a column of a 2D ArrayList in java?java - 如何在java中找到2D ArrayList的列的唯一值?
【发布时间】:2018-11-04 11:58:21
【问题描述】:
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 列的唯一元素 "C","G" 并且在第 3 列中有 2 唯一元素。

这可以使用loop 来完成,但我不能使用循环。使用 java stream 可能有解决办法。

此外,我如何才能一次在 1,2 列中获取具有 "A","B" 的行数,并且通常对于 N 列?

【问题讨论】:

    标签: java arraylist lambda java-8 java-stream


    【解决方案1】:

    对于您给定的数据结构;

    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方法生成的map的大小有关; countMapOfColumn.size()

    要获取单个字符计数,请使用带有键作为输入的结果映射,例如要获取column = 3 中的C 计数,请使用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 列中的不同值。这里我们只是映射第 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();
      

      【讨论】:

        猜你喜欢
        • 2021-02-21
        • 2013-11-22
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        相关资源
        最近更新 更多