如何返回包含一个列表中未在另一个列表中找到的对象的新列表

时间:2016-09-17 01:28:40

标签: java

例如,list1有" a,b,c"和list2有" b,c,t"。结果," a"应该退还。

这是我的代码:

public static <E> List<I> ReturnDifference(List<E> L1, List<E> L2)
{
    List<E> L3 = new ArrayList<I>();
       Iterator<E> iter1 = L1.iterator();
       while (iter1.hasNext())
       {

           String s1 = (String)iter1.next();
           Iterator<E> iter2 = L2.iterator();

           while (iter2.hasNext())
           {
               String s2 = (String)iter2.next();

               if (s1.compareTo(s2) != 0)
               {
                   L3.add((E)s1);
               }
           }
       }
       return L3;
   }

感谢您帮助我!

4 个答案:

答案 0 :(得分:2)

其他答案指出,有第三方库会做这种事情。他们将以更少的努力完成工作......并且比代码可能更有效率。

但是,我假设这是一次“学习练习”。所以这里有一些代码中的问题。

从最基本的开始:

  1. 使用“for each”语法:

       Iterator<T> it = x.iterator();
       while (it.hasNext()) {
           T t = it.next();
           ...
       }
    

    相当于

       for (T t: x.iterator() {
           ...
       }
    
  2. 如果使用任何不是字符串列表的参数调用ReturnDifference,您对类型转换的使用将会中断。

      String s1 = (String)iter1.next();
    

    应该是

      E s1 = iter1.next();
    

    依此类推。

  3. 您无需使用compareTo。请改用equals。这样做的好处是可以处理未实现Comparable<E>的元素类型。

  4. 为什么要返回参数类型为I而不是E的列表?

  5. 无数样式错误。最重要的是:

    • 方法名称必须 1 以小写字母开头。
    • 变量名必须以小写字母开头。
  6. 最后,您的代码中存在明显的逻辑错误:

     if (s1.compareTo(s2) != 0) {
         L3.add((E)s1);
     }
    

    如果你看一下代码中的那个语句,并考虑一下......很明显你要多次向L3添加相同的元素。

    我会留给你弄清楚如何处理它。

    1 - 从技术上讲,编译器允许你忽略它,但你&gt;&gt;可以&lt;&lt;让自己陷入困境。但更重要的是,如果您要求经验丰富的Java程序员阅读严重忽略样式约定的代码,他/她可能会直接拒绝。

答案 1 :(得分:0)

如何使用Apache Commons Substract方法?

答案 2 :(得分:0)

您可以尝试CollectionUtils中的intersection()和subtract()方法。

intersection()方法为您提供包含公共元素的集合,而subtract()方法为您提供了所有不常见的元素。

答案 3 :(得分:0)

不需要for循环或第三方库 它由内置的removeAll(Collection<?> c)方法支持。

List<String> list1 = Arrays.asList("a","b","c");
List<String> list2 = Arrays.asList("b","c","t");

List<String> result = new ArrayList<>(list1);
result.removeAll(list2);
System.out.println(result); // prints: [a]

如果由于list2 而导致性能下降,请先将其转换为Set,因为removeAll()方法是通过调用{{3}来实现的}}:

result.removeAll(new HashSet<>(list2));

技术上将性能从 O(m⋅n)改为 O(m + n)