从Java中大小不同的2个数组列表中查找不相似的元素

从Java中大小不同的2个数组列表中查找不相似的元素,java,string,arraylist,collections,Java,String,Arraylist,Collections,我有两个字符串类型的数组列表,如下所示: 列表a->[芒果、香蕉、苹果] 列表b->[人,苹果] 我必须从两个列表中找出不相似的元素 在我实施之前: List d = new ArrayList(a); toReturn.removeAll(b); return d; 但这段代码的问题是,我不希望Mango作为列表b中的第一个元素包含“Man”字符串。我只希望返回“Banana”。您可以在一个列表上迭代,找到其中不属于另一个列表的子字符串的项,然后当然返回相同的项,并反转参数: private

我有两个字符串类型的数组列表,如下所示:

列表a->[芒果、香蕉、苹果]

列表b->[人,苹果]

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

在我实施之前:

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

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

您可以在一个列表上迭代,找到其中不属于另一个列表的子字符串的项,然后当然返回相同的项,并反转参数:

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());
}
私有静态流筛选器非相似(列表a、列表b){
返回a.stream()
.filter(ai->b.stream().noneMatch(bi->ai.contains(bi)| bi.contains(ai));
}
公共静态列表非相似(列表a、列表b){
返回Stream.concat(filterNonSimilar(a,b),filterNonSimilar(b,a))
.collect(Collectors.toList());
}

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

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);

}
公共类Comp{
公共静态void main(字符串…字符串){
List lis1=新的ArrayList();
lis1.添加(“应用程序”);
lis1.添加(“男孩”);
lis1.添加(“CARR”);
List lis2=新的ArrayList();
lis2.添加(“苹果”);
lis2.添加(“car”);
列表结果=新建ArrayList();
for(字符串a:lis1){
for(字符串b:lis2){
如果(a)包含(b)){
结果.添加(a);
}
}
}
lis1.移除所有(结果);
系统输出打印LN(lis1);
}
} 输出:[男孩]


希望这会有所帮助。

I这篇作业?您的说明中肯定会有一些提示,说明哪些函数可供您使用。既然您提到您不希望将Man作为第一个字符串,那么这一定意味着您需要使用
包含
函数,然后在较小的列表中重复较长的列表并打印这些函数它不包含任何字母。实际上不是家庭作业。我遇到了这个问题,我想解决它。我可以使用任何东西。Mano和mango有什么相似之处?是因为man-word在这两个列表元素中都存在还是char-m-n在这两个列表元素中都存在。请澄清这一点。这不会处理“man”和“mango”之类的元素那个OP在例子中给出了。@Mureinik谢谢你抓住了那个,我真的错过了那个部分,我只是用期望的东西更新代码。