检查ArrayList是否包含来自另一个ArrayList的所有字符串

时间:2017-04-13 10:12:29

标签: java list 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);
    }
}

3 个答案:

答案 0 :(得分:1)

你可以做这样的事情

     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,那么第二个数组中的某些项目首先不存在。

结果包含字符串及其状态。

由于

答案 1 :(得分:0)

如果您有空间问题,例如您在一个文件中有数百万个单词,并且需要首先检查第二个文件的输入,请使用trie。从第一次开始制作并首先检查每一个第二个条目。

答案 2 :(得分:0)

<强>情况:

在你的问题中,你说你想要为每个元素返回它是否存在,并且在你的实际代码中你只返回一个匹配元素列表。

<强>解决方案:

您需要返回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;
}

<强>演示:

这是使用此方法的working Demo,分别返回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;
}

这是Demo已更新。