2012-05-04 7 views
27

java.util.Listの順序付けを行うJavaクラスを実装しています。このクラスを使用すると問題が発生します。私はリストを注文することができますが、オリジナルのリストを変更せずにコピーして、元のリストに加えられたすべての変更を登録することができます。ソートされたリストにはオブジェクトが含まれ、そのフィールドの1つに分類IDが格納され、このIDはリストのインデックス値で更新されます。java.util.listコレクションのコピー方法

私はクローンメソッドを使用しようとしましたが、リストはソートされませんが、元のリストの変更はクローンリストでも更新されます。

これを達成する方法はありますか?

マイコード:

List<Torero> listaTorero = tbTlgTorerolHome.findByExample(new Torero()); 
List<Torero> listaToreroTemp = ((List<Torero>) ((ArrayList<Torero>) listaTorero).clone()); 

Clasificacion clasificacion = new Clasificacion(); 

Iterator<Torero> iterTorero = clasificacion.getClasificacion(listaTorero, torero).iterator(); //Sorting List 

A Clasificacion方法:

public List<Torero> getClasificacion(List<Torero> listaToreroTemp, Torero torero) 
{ 

    List<Torero> listaTorero = new ArrayList<Torero>(); 

    Collections.sort(listaToreroTemp,new ToreroClasifiacionComparator()); 

    Iterator<Torero> iterTorero = listaToreroTemp.iterator(); 
    int index=1; 
    while(iterTorero.hasNext()) 
    { 
     Torero toreroTemp = iterTorero.next(); 
     toreroTemp.setNumClasificacion(index); 
     listaTorero.add(toreroTemp); 
     index=index+1; 
    } 
    return listaTorero; 
} 
+1

あなたが行っていることを確認できるようにコードを投稿してください –

+0

おそらく関連しています:[java.util.list Collectionをコピーする方法](http://stackoverflow.com/questions/10457087/how-to-copy-java -util-list-collection) –

+1

質問を編集してコードを追加しました。 – user1260893

答えて

62

あなたがそうのような前のリストの入力で新しいリストを作成することがあります。

List one = new ArrayList() 
//... add data, sort, etc 
List two = new ArrayList(one); 

これは、あなたが最初のリストから独立して含まれているためか、何elemtents変更することができます。

2つのリストには同じオブジェクトが含まれることに注意してください。リスト2のオブジェクトを変更すると、同じオブジェクトがリスト1で変更されます。

例:

MyObject value1 = one.get(0); 
MyObject value2 = two.get(0); 
value1 == value2 //true 
value1.setName("hello"); 
value2.getName(); //returns "hello" 

編集

あなたがそうのようなリストの各要素の深いコピーが必要この回避するために、次のようにコピーして

List<Torero> one = new ArrayList<Torero>(); 
//add elements 

List<Torero> two = new Arraylist<Torero>(); 
for(Torero t : one){ 
    Torero copy = deepCopy(t); 
    two.add(copy); 
} 

を:

public Torero deepCopy(Torero input){ 
    Torero copy = new Torero(); 
    copy.setValue(input.getValue());//.. copy primitives, deep copy objects again 

    return copy; 
} 
+0

しかしこれは私が避けたいものです。たとえば、List2でvalue2を変更した場合、List1にこの変更を伝播したくありません。 – user1260893

+0

ああ、それは物事を変えます、あなたはToreroを別のものにコピーするためのメソッドやコンストラクタを持っていますか? –

+0

いいえ、私は何も持っていません、あなたは私に何か手掛かりを与えることができますか? – user1260893

20

そのを並べ替える、ArrayListのコピーコンストラクタを使用します。

List oldList; 
List newList = new ArrayList(oldList); 
Collections.sort(newList); 

コピーを作成した後、newListの変更はoldListに影響しません。

注しかし要素つのリストのに加えられた変更が要素他のに影響を与えるようにのみ参照は、コピーされたので、2つのリストには、同じオブジェクトを共有していること。

+0

コピーされたリストの要素に対する変更が伝播されないことはありますか? – user1260893

+0

全く同じオブジェクトへの複数の参照があるため、技術的に伝播しません。あなたはコピーを作成しなければならず(時間と空間の有効性を低下させる)、不変のオブジェクト(または可変オブジェクトのまわりの不変ラッパー)を使用する必要があります。 – Vlasec

関連する問題