【问题标题】:Find non-similar elements from 2 array list having different sizes in Java从Java中具有不同大小的2个数组列表中查找不相似的元素
【发布时间】:2019-02-15 14:53:22
【问题描述】:

我有两个字符串类型的数组列表:

列出一个 -> [芒果、香蕉、苹果]

列表 b -> [Man, Apple]

我必须从两个列表中找出不相似的元素。

直到我实现了这个:

List d = new ArrayList(a);
toReturn.removeAll(b);
return d;

但是这段代码的问题是我不希望 Mango 作为列表 b 中的第一个元素包含“Man”字符串。我只想退回“香蕉”。

【问题讨论】:

  • 我这个作业?您的说明必然会提示您可以使用哪些功能。
  • 既然您提到您不希望 Man 作为第一个字符串,那么这一定意味着您需要使用 contains 函数,然后通过较小的列表遍历较长的列表并打印那些不't contain 任何字母。
  • 实际上不是作业。我遇到了这个问题,我想解决它。我可以使用任何东西。
  • man 和 mango 有什么相似之处?,是因为 man 词出现在两者中还是 char m 出现在两个列表元素中。请清楚这一点。

标签: java string arraylist collections


【解决方案1】:

您已经迭代了一个列表,然后必须在另一个列表中进行比较,如果该元素存在于第二个列表中(反之亦然),则删除该元素,下面我将分享此方法的示例代码。

public class Comp {

public static void main(String... strings) {

    List<String> lis1 = new ArrayList<>();
    lis1.add("applefy");
    lis1.add("boy");
    lis1.add("carrr");

    List<String> lis2 = new ArrayList<>();
    lis2.add("apple");
    lis2.add("car");

    List<String> result = new ArrayList<>();
    for (String a : lis1) {

        for (String b : lis2) {
            if (a.contains(b)) {
                result.add(a);
               }

        }

    }

    lis1.removeAll(result);

    System.out.println(lis1);

}

} 输出:[男孩]

希望这会有所帮助。

【讨论】:

  • 这不会处理 OP 在示例中给出的“Man”和“Mango”等元素。
  • @Mureinik 感谢您发现这一点,我真的错过了那部分,我只是用预期的东西更新代码。
【解决方案2】:

您可以遍历一个列表并在其中找到不是另一个列表的子字符串的项目,然后当然可以将参数颠倒过来:

private static Stream<List> filterNonSimilar(List<String> a, List<String> b) {
    return a.stream()
            .filter(ai -> b.stream().noneMatch(bi -> ai.contains(bi) || bi.contains(ai));
}

public static List<String> nonSimilar(List<String> a, List<String> b) {
    return Stream.concat(filterNonSimilar(a, b), filterNonSimilar(b, a))
                 .collect(Collectors.toList());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多