簡體   English   中英

檢查ArrayList是否包含來自另一個ArrayList的所有字符串

[英]check if an ArrayList contains all Strings from another ArrayList

我需要檢查ArrayList中的所有字符串是否都存在於另一個ArrayList中。 我可以使用containsAll,但這不是我想要實現的。 讓我在示例中向您展示:

assertThat(firstArray).containsAll(secondArray);

此代碼將檢查一個數組中的所有項目是否在另一個數組中。 但是我需要檢查一個數組中的每個項目是否都包含在第二個數組中的任何位置。

List<String> firstArray = new ArrayList<>;
List<String> secondArray = new ArrayList<>;
firstArray.add("Bari 1908")
firstArray.add("Sheffield United")
firstArray.add("Crystal Palace")

secondArray.add("Bari")
secondArray.add("Sheffield U")
secondArray.add("C Palace")

所以我想檢查secondArray中的第一項是否在firstArray(true)不是second(true)third(false) 我寫了完成這項工作的代碼,但是它很復雜,我想知道是否有任何更簡單的方法可以實現這一目標(也許使用hamcrest匹配器或類似方法)

ArrayList<String> notMatchedTeam = new ArrayList<>();
for (int i = 0; i < secondArray.size(); i++) {
    String team = secondArray.get(i);
    boolean teamMatched = false;
    for (int j = 0; j < firstArray.size(); j++) {
        teamMatched = firstArray.get(j).contains(team);
        if (teamMatched) {
            break;
        }
    }
    if (!teamMatched) {
        notMatchedTeam.add(team);
    }
}

你可以做這樣的事情

     List<String> firstArray = new ArrayList<>();
            List<String> secondArray = new ArrayList<>();
            firstArray.add("Bari 1908");
            firstArray.add("Sheffield United");
            firstArray.add("Crystal Palace");

            secondArray.add("Bari");
            secondArray.add("Sheffield U");
            secondArray.add("C Palace");

           Set<String> firstSet= firstArray
                    .stream()
                    .collect(Collectors.toSet());

         long count=  secondArray.stream().filter(x->firstSet.contains(x)).count();

///
  Map<String, Boolean> result =
                secondArray.stream().collect(Collectors.toMap(s->s, firstSet::contains));

如果count> 0,則第二個數組中的某些項不在第一個中。

結果包含字符串及其狀態。

謝謝

如果您擔心空間問題,例如一個文件中有數百萬個單詞,並且需要先檢查第二個文件的條目,然后使用trie。 從第一個開始嘗試並檢查第二個中的每個條目。

情況:

在您的問題中,您說過要為每個元素返回(如果存在或不存在),而在實際代碼中,您僅返回匹配元素的列表。

解:

您需要返回Boolean結果列表,這是您需要的代碼:

public static List<Boolean> whichElementsFound(List<String> firstList, List<String> secondList){
        ArrayList<Boolean> resultList = new ArrayList<>();
        for (int i = 0; i < secondList.size(); i++) {
            String team = secondList.get(i);
            resultList.add(firstList.contains(team));
        }
        return resultList;
}

演示:

這是使用此方法的工作演示 ,分別返回List<Boolean>以反映在第二個列表中找到第一個列表中的哪個元素。

編輯:

如果要返回未找到的元素列表,請使用以下代碼:

public static List<String> whichElementsAreNotFound(List<String> firstList, List<String> secondList){
    ArrayList<String> resultList = new ArrayList<>();
    for (int i = 0; i < secondList.size(); i++) {
        String team = secondList.get(i);
        if(!firstList.contains(team)){
            resultList.add(team);
        }
    }
    return resultList;
}

這是演示更新。

暫無
暫無

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

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