0

この単純な Java 演習を機能させようとしていますが、うまくいかず、その理由もわかりません。

これが私のコードです:

public LinkedList<T> toSet()
{
    LinkedList<T> retList; 
    retList = lista;
    for(T elem1 : retList)
        for(T elem2 :retList)
        {
            if(retList.indexOf(elem1) == retList.indexOf(elem2)) 
                continue;
            else if(elem1.equals(elem2)) 
                retList.remove(elem1);
        }

    return retList;
}

このメソッドは、リストに複数回表示される要素を削除する必要があります。私はEclipseでそれをデバッグしましたretList.remove(elem1)が、リストが変更されていないことがわかりました!

私の間違いはどこですか?

4

4 に答える 4

5

使用する必要があります.clone()

LinkedList<T> retList = (LinkedList<T>) lista.clone();

LinkedListまた、ループ内の whileから削除するには、反復子を使用する必要があります。このSO answerを参照してください。

于 2013-05-22T18:39:38.880 に答える
1

これは演習だとおっしゃっていますが、ここでは、Setコレクションを使用せずに、セットを表すリスト (重複なし) を作成することが目標であると想定しています。

これは演習なので、完全なコードは提供しませんが、他の回答とは異なるアプローチを提供します。

  1. 新しい空の を作成しますMap<T, Object>
  2. 値として機能するオブジェクトを作成します。単純なものでnew Object()十分です。
  3. 新しい空の を作成しますLinkedList<T>。これはあなたが返すリストです。
  4. リストから を作成Iterator<T>します。これは で行うことができますlista.iterator()
  5. hasNext()イテレータが次 のようになっている間、リストを反復処理します。
    1. イテレータの を使用して、現在の要素を取得しますnext()
    2. containsKey()5.1 で取得した要素である map かどうかを確認します。
      • 存在する場合、その要素は重複しているため、新しいリストには追加されません。スキップするだけです。
      • そうでない場合、要素は新しいのでadd()、新しいリストに追加しput()、2 で作成したプレースホルダー値をキーとしてマップに追加します。
    3. 5 を繰り返します。つまり、ループが続きます。
  6. 重複のない新しいリストを返します。
于 2013-05-22T19:13:38.950 に答える