簡體   English   中英

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

[英]How to find unique value of a column of a 2D ArrayList in java?

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列?

對於您給定的數據結構;

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

你的問題沒有編譯。 假設您已按如下方式定義列表,則可以使用以下內容輕松找到第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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM