首页 > 解决方案 > 如何比较两个数组列表并提取第三个数组列表中两者都不常见的元素

问题描述

我有两个包含一些元素的数组列表我正在比较两个数组列表的元素并尝试提取第三个数组列表中两个列表中不常见的元素。

这是我到目前为止所做的:

public class Details
{
   public static void main(String [] args)
    {

      ArrayList<String> al1= new ArrayList<String>();
      al1.add("hi");
      al1.add("How are you");
      al1.add("Good Morning");
      al1.add("bye");
      al1.add("Good night");

      ArrayList<String> al2= new ArrayList<String>();
      al2.add("Howdy");
      al2.add("Good Evening");
      al2.add("bye");
      al2.add("Good night");

      //Storing the comparison output in ArrayList<String>
      ArrayList<String> al3= new ArrayList<String>();
      for (String temp : al1)
          al3.add(al2.contains(temp) ? "Yes" : "No");
      System.out.println(al3);

  }
}

输出

[No, No, No, Yes, Yes]

我不希望以是或否形式输出我希望新数组列表中的元素在两个列表中都不常见。

有人请让我知道我怎样才能达到预期的结果。任何帮助,将不胜感激。

谢谢

标签: java

解决方案


首先,请编程到List接口(而不是ArrayList具体类型)。您还可以使用Arrays.asList来缩短您的初始化。然后我会stream()每个List- 你想要过滤流中不包含在另一个元素中的元素List,然后将它们添加到你的第三个List。就像是,

List<String> al1 = Arrays.asList("hi", "How are you", "Good Morning", "bye", "Good night");
List<String> al2 = Arrays.asList("Howdy", "Good Evening", "bye", "Good night");
List<String> al3 = al1.stream().filter(s -> !al2.contains(s)).collect(Collectors.toList());
al3.addAll(al2.stream().filter(s -> !al1.contains(s)).collect(Collectors.toList()));
System.out.println(al3);

哪个输出

[hi, How are you, Good Morning, Howdy, Good Evening]

或者,没有流(这样你可以更好地理解算法),

List<String> al3 = new ArrayList<>();
for (String s : al1) {
    if (!al2.contains(s)) {
        al3.add(s);
    }
}
for (String s : al2) {
    if (!al1.contains(s)) {
        al3.add(s);
    }
}
System.out.println(al3);

推荐阅读