45

java.util.Listの順序付けを担当するJavaクラスを実装しています。このクラスを使用すると問題が発生します。リストを注文することはできますが、元のリストに加えられたすべての変更を登録できるように、「元の」リストを変更せずにコピーしたいと思います。ソートされたリストにはオブジェクトが含まれ、そのフィールドの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;
}
4

2 に答える 2

89

次のように、前のリストの入力を使用して新しいリストを作成できます。

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;
}
于 2012-05-04T22:52:31.763 に答える
23

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

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

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

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

于 2012-05-04T22:51:26.747 に答える