2016-11-11 4 views
0

私は見た限りで検索しましたが、私はこの質問への答えを見つけるのに苦労しています。私はIterableオブジェクトを持っていて、その中の各項目を変更したい(私はそれに追加したくない)新しい価値をもって私は試しましたJavaでIterable <T>の各要素を変更するにはどうすればよいですか?

それを変更するが、それはforeachループであるため明らかに動作しませんでした。誰かが私がこのコードで間違っていることを私に見せてもらえますか? (。アイデアは、私は私の反復処理可能の項目の順序を逆にしようとしているということです)

public class LinkedList<T> 
{ 
    Iterable<T> list; 
    public LinkedList() {} //create an empty list 
    public LinkedList(Iterable<T> iterable) 
    { 
     list = iterable; 
    } 
    @SuppressWarnings("unchecked") 
    public Iterable<T> reverse() 
    { 
     Integer size = size(); 
     List<T> a = new ArrayList<T>(); 
     Integer index = size - 1; 
     for (T e : list) 
     { 
      a.add(e); 
     } 
     Iterator iterator = list.iterator(); 
     while (iterator.hasNext()) 
     { 
      T element = (T)iterator.next(); 
      element = a.get(index); 
      System.out.println(element); 
      index--; 
     } 
     return list; 
    } 
} 
+3

で説明したように、完了時に繰り返し可能な要素が異なる必要がありますか?ありえない。イテラブルはそのようには機能しません。 – user2357112

+0

Iterableの要素を逆にしたいだけです。それは可能ですか?@ user2357112 – TurboCrackers

+0

あなたは "逆イテレータ"を返すことができますが、あなたのコードで何も変更されていません... –

答えて

0

あなたはこのループ構造を理解する必要があります。

for (T e : list) 

これは、変数eコピーを割り当てリスト内のあるオブジェクトへの参照を返します。

あなたはeに新しい値を代入しようとした:

e = a.get(index); 

をしかし、このすべてが実現は、参照のごコピーを上書きです。リストlistは、常に使用していた参照を引き続き使用します。


最終目標は、逆方向に進む反復可能性を返すことですか?ここにはいくつかのオプションがあります。

  • は変わらない基本的なリストを維持するが、それに逆のビューを提供するために、カスタムイテレータを作ります。このイテレータはIterable<T>を提供できます。
  • リスト自体がの逆順になるように、下にあるリストの内容をシャッフルします(これにはCollections.reverse(list)を使用できます)。自然な反復順序は、元のリストの「逆の」反復に似ています。
  • 既存のリストを変更する代わりに、リストのコピーを逆に作成します。あなたはそれをやっている自分のためにこれは難しいでしょう

一つはこれです:

Iterable<T> list; 
public LinkedList(Iterable<T> iterable) { 
    list = iterable; 
} 

このIterable限り具体的に何かを受け入れるようにが必要ですか?代わりにListを受け入れることができますか(任意のインデックスで要素を参照することができます)? があり、Iterableとなる場合は、に格納する必要はありません。 ArrayListにその内容を挿入すると、listという変数は実際にはListになります。

+0

ポイントは 'e'は別の変数です。参照がコピーされるという事実は自動的に続きます。 – EJP

関連する問題