2016-09-17 8 views
0

たとえば、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; 
    } 

は私を助けてくれてありがとう!

+0

L1またはL2を変更していないので、forループまたはforループを試すことがあります。また、あなたはそれを実行するときに何を得ていますか?エラーはどこですか?これまでに試してみたことを投稿してください –

答えて

0

CollectionUtilsからintersection()およびsubtract()メソッドを試すことができます。

intersection()メソッドは、共通の要素を含むコレクションを提供し、subtract()メソッドはすべての珍しいものを提供します。

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] 

あなたが悪いのパフォーマンスが発生した場合list2removeAll()方法がlist2.contains(Object o)を呼び出すことで実装されているので、最初Setに変換し、ですので:

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

技術的にOからパフォーマンスを変更します(m・n)~O(m + n)である。

2

他の回答は、この種のことを行うサードパーティのライブラリがあることを指摘しています。彼らは少ない労力で仕事をします...あなたのコードよりも効率的です。

しかし、私はこれが「学習の練習」であると仮定しています。そこで、あなたのコードのいくつかの問題があります。最も基本的で開始

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

型キャストのご使用はするつもりです

for (T t: x.iterator() { 
     ... 
    } 
  • と同等です:

    1. は、構文 "各" を使用ReturnDifferenceを文字列のリストではない引数で呼び出すと、ブレークします。

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

      はそうで

      E s1 = iter1.next(); 
      

      とする必要があります。

    2. compareToを使用する必要はありません。代わりにequalsを使用してください。これには、Comparable<E>を実装していない要素タイプで作業する利点があります。

    3. Iではないリストを返すのはなぜですかEですか?

    4. 多くのスタイルエラーがあります。最も重要なのは、次のとおりです。

      • メソッド名小文字で必要があります開始。
      • 変数名は、小文字で始まる必要があります。

    最後に、あなたのコード内の明白な論理エラーがあります:

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

    あなたは、その文がコードである場合を見て、考えてみれば...それがあるべき同じ要素をL3に複数回追加しようとしていることが明らかです。

    私はそれについて何をすべきかを理解するためにあなたに任せます。


    1 - 技術的には、コンパイラはこれを無視することができますが、あなた>> < <はトラブルに自分自身を取得することができます。しかし、もっと重要なのは、経験豊富なJavaプログラマに、スタイル規則を無視してコードを読ませるように依頼すれば、彼/彼女はポイントを空白にする可能性が高いということです。

  • 関連する問題