簡體   English   中英

從 java 的列表中查找(減少)列表的適當子集

[英]Find (Reduce) proper subsets of lists from list of lists in java

我想在下面得到這樣的東西:

//Input:
{
    "paths": [
        [
            "A","B"
        ],
        [
            "A","B","C"
        ],
        [
            "A","C"
        ],
        [
            "A","D"
        ],
        [
            "A"
        ]
    ]
}

//Output:
{
    "paths": [
        
        [
            "A","B","C"
        ],
        [
            "A","D"
        ]
       
    ]
}

我的代碼是什么樣的:

List<LinkedList<String>> paths = new LinkedList<>();
//...
//some process that adds elements to paths.

paths.sort(Comparator.comparingInt(LinkedList::size));

List<LinkedList<String>> uniquePaths = new ArrayList<>();

                for (int i = 0; i < paths.size(); i++) {
                    boolean unique=true;
                    for (int j = i+1 ; j < paths.size(); j++) {

                        if (paths.get(j).containsAll(paths.get(i))){
                            unique=false;
                            break;
                        }
                    }
                    if(unique) {
                        uniquePaths.add(paths.get(i));
                    }
                }

但是這個邏輯似乎有點不對勁。(這會導致類似: [[A][A,D][A,B,C]] )請幫助解決這個問題。

類似的問題,但在 R: 如何減少(子集)列表列表?

您沒有根據整個數據集檢查每個組合。 您的錯誤源於嵌套循環,其中迭代從索引j=i+1開始。

由於containsAll()的性能取決於作為參數傳遞的集合,因此從給定的列表列表中生成集合列表是有意義的。

下面是如何使用 Stream API 來實現它。

List<List<String>> source = List.of(
    List.of("A", "B"), List.of("A", "B", "C"),
    List.of("A", "C"), List.of("A", "D"), List.of("A")
);
        
List<Set<String>> sets = source.stream()
    .map(HashSet::new)
    .collect(Collectors.toList());
    
List<List<String>> result = sets.stream()
    .filter(set -> sets.stream().filter(s -> !s.equals(set)).noneMatch(s -> s.containsAll(set)))
    .map(ArrayList::new)
    .collect(Collectors.toList());
    
System.out.println(result);

Output:

[[A, B, C], [A, D]]

請注意,我們需要排除當前字符串組合,同時檢查它是否是任何其他元素的子集,請參閱上面代碼中的filter(s ->.s.equals(set))

暫無
暫無

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

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