2011-01-18 16 views
0

linkedlist2.set(0,9999)それはlinkedlist2 = [999,6,7]に変わり、linkedlist1[1,2,3,4,9999,7,8];を次のようになります。私が呼び出す場合linkedlist1= 1,2,3,4;Java初心者:リンクされたリストを別のリンク先にリンクするにはどうすればよいですか?私が持っている場合は

linkedlist2= 5,6,7;は、私は、このような方法でlinkedlist1の最後にlinkedlist2を取り付けてできますか?

これは可能ですか?あるいは私は別の構造が必要ですか?次のコードは動作しませんでした

List<Double> l1 = new LinkedList<Double>(Arrays.asList(1.0,2.0)); 
List<Double> l2 = new LinkedList<Double>(Arrays.asList(3.0,4.0)); 
l1.addAll(l2); 
System.out.println(l1); 
l2.set(0, 9.0); 
System.out.println(l1); 

OUTPUT:

[1.0, 2.0, 3.0, 4.0] 
[1.0, 2.0, 3.0, 4.0] 
+0

質問するときに「コードが機能しませんでした」とは決して言わないでください。代わりにあなたが期待した結果とあなたが得た結果を説明してください。それ以外の場合は、技術的にコードがあなたの望む通りに機能しているので、実際には混乱します。 – jzd

+0

なぜこれをやりたいですか?これを行うには、同じオブジェクトを修正する2つの完全に別々の方法よりも優れた設計方法があります。 – jprete

答えて

4

標準LinkedListのクラスはこの能力に欠ける呼び出すことができます。

Donal Boyleの投稿では、あるリストの内容を別のリストに追加することはできますが、これはあなたの説明としてのリンケージを維持しません。

+0

どのようなデータ構造がこの機能を提供していますか? –

+0

私はそれを提供する人は誰も知らない。 LinkedListインターフェイスに準拠したものを書くことができますが、このタイプのスプライシングには新しいメソッドがいくつか用意されています。 – Darron

0

を1つのリストを更新し、他にも反映アップデートを見てについての質問に答えるために、その答えは、それが依存しています。

最初のリストのオブジェクトを更新すると、変更が表示されます。オブジェクトを置き換えた場合、変更は表示されません。最初のリストで.set()を呼び出すと、リスト内のオブジェクトが置き換えられます。残念ながら、プリミティブ(またはそのクラス表現、この場合はFloat)の値を置き換えずに更新することはできません。二つのリストを追加する

は、あなたがjava.util.LinkedListを使用していると仮定すると、あなたは、Javaを提供addAll

+0

私はコードを提供しました –

+0

私はあなたがリストに入れているオブジェクトではうまくいかない理由について私の答えにいくつかの情報を追加しました。 –

0

addAll()は、2番目のリンクされたリストから値を取得するだけです。 2番目のリストのインデックスと設定値の変更は、最初のリストには影響しません。 (注:両方のオブジェクトが同じオブジェクトを指しているため、オブジェクト自体の変更はそのまま残ります)。

あなたが探しているものなら、リストを作成することができます。

+0

nope既にリストのリストを持っていて、addallを使ってリストを追加していましたが、今はフラットリンクリストが必要です。最後の要素が他の要素の最初の要素に接続されています –

+0

AddAll() 。リスト内のオブジェクトは同じであるため、不変でないものを使用する場合、これは問題ではありません。 – jzd

0

これを達成するための最も簡単な方法は、あなたの項目のための適切なクラスを持っており、LinkedListのに頼るの代わりに、お互いにこのクラスMyIntリンクのインスタンスを持っている、つまり、あなたの整数を保持するカスタムクラスにMyInt next;フィールドを追加することです。 次に、説明されているようにリンクします。 リスト構造に触れなくても1つのインスタンスへの変更を行うことができ、next参照によってこのリストを反復処理するときに反映されます。

1

あなたがすることはできませんが、代わりのリストのリストを持つことができますが、あなたが必要としてそれが動作するかどうかはわからないよう:

import java.util.*; 
import static java.lang.System.out; 
class ListOfLists { 
    public static void main(String ... args) { 

    List<Integer> a = new LinkedList<Integer>(Arrays.asList(1,2,3,4)); 
    List<Integer> b = new LinkedList<Integer>(Arrays.asList(5,6,7)); 

    List<List> list = new LinkedList<List>(); 
    list.add(a); 
    list.add(b); 

    out.println("Before : " + list); 
    b.set(0, 999); 

    out.println("After : " + list); 

    } 
} 

Before : [[1, 2, 3, 4], [5, 6, 7]] 
After : [[1, 2, 3, 4], [999, 6, 7]] 
0

この問題はのための素晴らしいアプリケーションであると思われますsubList(int, int)方法:

List<Double> l1 = new LinkedList<Double>(Arrays.asList(1.0, 2.0, 3.0, 4.0)); 
List<Double> l2 = l1.subList(2, 4); 

ああ、のsubListのjavadocは述べて:

リストのセマンティクスは0で返されます バッキングリスト(つまり、、このリスト)は 構造的に変更されています他の方法で他の 返されたリストを介してより。 (構造変更はそうでない進行中の反復が 不正な結果が生じたなど でそれを乱すこのリストのサイズ、または を変更するもの ある。)

ですから、メソッドを使用する場合l1の.addのように、運が悪いかもしれません。実際には、フェイル・ファーストのリスト・クラスがAbstractList(たとえば、LinkedList)から派生した場合、subListの親リストが構造的に変更された後に、subListはConcurrentModificationExceptionをスローする必要があります。

ただし、親リストの構造変更から離れた場合(またはそのような変更後にサブリストを再作成した場合)は、すべてが期待通りに機能します。

関連する問題