簡體   English   中英

如何返回一個新列表,其中包含一個列表中的對象,而該對象在另一個列表中找不到

[英]How to return a new list that contains the objects in one list that are not found in another list

例如,列表1具有“ a,b,c”,列表2具有“ 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;
   }

感謝你們對我的幫助 !

其他答案指出,有第三方庫將執行此類操作。 他們將以更少的精力來完成這項工作,並且比您的代碼可能會更高效。

但是,我假設這是一次“學習練習”。 因此,這是您代碼中的一些問題。

從最基本的開始:

  1. 使用“針對每個”語法:

      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以小寫字母開頭。
    • 變量名稱必須以小寫字母開頭。

最后,您的代碼中存在明顯的邏輯錯誤:

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

如果您查看該語句在代碼中的位置,然后考慮一下……顯然,您將多次向L3添加相同的元素。

我將留給您找出解決方法。


1-從技術上講,編譯器允許您忽略此問題,但是>> can <<會使您陷入麻煩。 但是更重要的是,如果您要求經驗豐富的Java程序員閱讀嚴重忽略樣式約定的代碼,則他/她可能會直截了當地拒絕。

如何使用Apache Commons Substract方法?

您可以嘗試使用CollectionUtils中的交集()和減法()方法。

交集()方法為您提供了包含常見元素的集合,而減法()方法為您提供了所有不常見的元素。

無需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 而導致性能list2 ,請首先將其轉換為Set ,因為removeAll()方法是通過調用list2.contains(Object o)

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

從技術上講,這會將性能從O(m⋅n)更改為O(m + n)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM