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

时间:2018-11-04 11:58:22

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

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可能有解决方案。

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

2 个答案:

答案 0 :(得分: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()

要获取单个字符计数,请使用键作为输入的结果映射,例如要获取Ccolumn = 3的计数,请使用countMapOfColumn.get("C"),它将返回{{1} }

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

更新

获取以连续列表Table开头的行数;

list = {"A", "B"}

答案 1 :(得分: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();