私はJava Java.util.Listの順序付けを担当するクラスを実装しています。このクラスを使用すると問題が発生します。リストを順序付けできますが、「元の」ソート済みリストにはオブジェクトが含まれ、そのフィールドの1つには分類IDが格納され、このIDはリストのインデックス値で更新されます。
クローンメソッドを使用しようとしましたが、リストはソートされませんが、元のリストで行われた変更はクローンリストでも更新されます。
それを達成する方法はありますか?
私のコード:
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
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;
}
次のように、前のリストを入力して新しいリストを作成できます。
List one = new ArrayList()
//... add data, sort, etc
List two = new ArrayList(one);
これにより、最初のリストとは無関係に、順序または含まれる要素を変更できます。
ただし、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;
}
ArrayListコピーコンストラクターを使用して、並べ替えます。
List oldList;
List newList = new ArrayList(oldList);
Collections.sort(newList);
コピーを作成した後、newListを変更してもoldListには影響しません。
ただし、referencesのみがコピーされるため、2つのリストは同じオブジェクトを共有するため、1つのリストのelementsに加えられた変更はelementsに影響することに注意してください。他の。