簡體   English   中英

檢查“列表列表”中是否存在特定列表,與順序無關

[英]Check If a particular list is present in “List of Lists” irrespective of order

我有一個類似的清單

[[0, 5, 10, -1], [1, 8, 3, 4], [2, 9, 6, 7]]

現在我要搜索如果上面的列表列表包含[8,1,4,3],我只是想忽略元素的順序。 我該如何實現。 **我嘗試過包含,但順序不同時失敗。

編輯:我正在使用的代碼

for(List<Integer> innerSList : PermutaionS_toDraw)
        {int elem_trans = 0;

        if(!Final.contains(innerSList))
        {
        Final.add(PermutaionS_toDraw.get(PermutaionS_toDraw.indexOf(innerSList)));
        }
}

遍歷所有列表,對於每個列表,檢查它們的長度與您要比較的列表的長度相同;如果是,則調用containsAll以檢查它是否包含所有值。

for(List<Integer> innerList : permutaionsToDraw){
    int elemTrans = 0;

    if(final.size() != innerList.size() || !final.containsAll(innerSList)) {
        final.add(permutaionsToDraw.get(permutaionsToDraw.indexOf(innerList)));
   }
}

注意

我重命名了您的變量以符合Java命名約定

如您所說,您將要執行一個包含,但是我認為您執行的級別有誤。 您不想遍歷主列表是否包含您的子列表,而是想遍歷主列表並檢查其每個值是否包含所有搜索值。 例如,

for (List<String> subList : mainList) {
   if (subList.containsAll(searchList) {
      return true;
   }
}
return false;

這將遍歷您的主列表,並檢查其每個子級是否包含您要搜索的所有值。 希望這會有所幫助,並且我已經清楚地解釋了!

注意:這取決於您使用的集合類型。 標准的String []不適用於此代碼

編輯:對您發布的代碼做出反應。 我相信您所需要更改的只是將包含轉換為包含全部。 包含將只在Final中尋找完全匹配的內容,但是包含所有將比較內容並檢查整數中是否完全包含整數集合。 因此,它應該看起來像這樣

List<List<Integer>> finalCopy = new LinkedList<>();
for(List<Integer> innerSList : PermutaionS_toDraw){
   for (List<Integer> subList : Final) {
      if(!subList.containsAll(innerSList)) {
         finalCopy.add(innerSList);
      }
   }
}
Final.addAll(finalCopy);

這可以通過在列表接口的任何實現類(在我的示例中為ArrayList)上使用.ContainsAll()方法來完成。 ContainsAll()的參數接受一個Collection,ContainsAll()返回一個布爾值。 請參閱: 列表

如果您已經在使用數組,則可以使用Arrays.asList()進行轉換。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {



public static void main(String[] args) {
    List<Integer> integersList = new ArrayList<>();
    integersList.add(1);
    integersList.add(2);
    integersList.add(3);
    integersList.add(4);

    List<Integer> integersList2 = new ArrayList<>();
    integersList2.add(5);
    integersList2.add(6);
    integersList2.add(7);
    integersList2.add(8);

    List<Integer> integersList3 = new ArrayList<>();
    integersList3.add(1);
    integersList3.add(2);
    integersList3.add(3);
    integersList3.add(4);

    List<List> listOfLists = new ArrayList<>();
    listOfLists.add(integersList);
    listOfLists.add(integersList2);
    listOfLists.add(integersList3);

    List<Integer> numbersToLookFor = new ArrayList<>();
    numbersToLookFor.add(1);
    numbersToLookFor.add(2);
    numbersToLookFor.add(3);
    numbersToLookFor.add(4);

    for (List l : listOfLists) {
        if (l.containsAll(numbersToLookFor)) {
            System.out.println(l + "does contain " + numbersToLookFor);
        }
    }

}
}

輸出:

[1, 2, 3, 4] does contain [1, 2, 3, 4]
[5, 6, 7, 8] does NOT contain [1, 2, 3, 4]
[1, 2, 3, 4] does contain [1, 2, 3, 4]

編輯:如果您要更改數字以尋找不同的順序,它將仍然返回true。

 //CHANGED from 1 2 3 4 --> 3 1 4 2
    List<Integer> numbersToLookFor = new ArrayList<>();
    numbersToLookFor.add(3);
    numbersToLookFor.add(1);
    numbersToLookFor.add(4);
    numbersToLookFor.add(2);

    for (List l : listOfLists) {
        if (l.containsAll(numbersToLookFor)) {
            System.out.println(l + " does contain " + numbersToLookFor);
        } else
            System.out.println(l + " does NOT contain " + numbersToLookFor);
    }
}

輸出:

[1, 2, 3, 4] does contain [3, 1, 4, 2]
[5, 6, 7, 8] does NOT contain [3, 1, 4, 2]
[1, 2, 3, 4] does contain [3, 1, 4, 2]

這應該可以解決問題。 對於每個子列表,此摘要將檢查搜索列表的大小是否相同,是否包含相同的元素(以任何順序排列)以及是否不在列表的最終列表中。

for(List<Integer> innerSList : PermutaionS_toDraw)
        {    
        if(searchlist.size() == innerSList.size() && searchList.containsAll(innerSList)
           && !Final.contains(searchList))
        {
        Final.add(PermutaionS_toDraw.get(PermutaionS_toDraw.indexOf(innerSList)));
        }
}

如果要檢查子列表是否包含元素而不考慮順序,這與檢查每個元素的編號是否相同或它們的排序列表是否相等是一回事。 因此,您要做的是要么計算列表中的每個數字並將其添加到HashMap中,要么按排序順序比較兩個列表

暫無
暫無

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

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