2011-11-12 14 views
0

定期的にクリアされたオブジェクトのJavaリストがデータベースから更新されたバージョンで再ロードされています。リロードする前に、ユーザは特定の方法でリストを注文することを選択しているかもしれない。前のリストの順番を新しいリストに適用するアルゴリズムを見つける必要があります。配列の順番を新しい配列にコピー

オブジェクトが実質的にランダムな順序である可能性があるため、コンパレータは使用できません。事前に

public static List<RetrievedPage> copyPreviousListOrderToFreshList(List<RetrievedPage> previousCopyOfList, List<RetrievedPage> freshCopyOfList) 
{  
    for (RetrievedPage retrievedPage : previousCopyOfList) 
    { 
       //reordering, but how? 
    } 

    return freshCopyOfList; 
} 

おかげで、 バリー

答えて

2

あなたはまだちょうど前のリスト内の位置に応じたアイテムを比較すると、比較器を使用することができます。

は、ここに私のメソッドスタブです。もちろん

Collections.sort(freshCopyOfList, new Comparator<RetrievedPage>() { 
    public int compare(RetrievedPage o1, RetrievedPage o2) { 
     int firstPagePosition = previousCopyOfList.indexOf(o1); 
     int secondPagePosition = previousCopyOfList.indexOf(o2); 

     if (secondPagePosition == -1) return -1; 
     if (firstPagePosition == -1) return 1; 

     return firstPagePosition - secondPagePosition; 
    } 
}); 

あなたがリストに別のオブジェクトを持っている場合、あなたは比較オブジェクト内のequals()hashCode()メソッドをオーバーライドすることを忘れてはなりません。それ以外の場合は、indexOf()メソッドはまったく同じオブジェクトを検索し、意図したとおりに等価であるかどうかをテストしません。

+0

ありがとうMalcolm - JUnitの緑色の線が表示されます。 Comparatorの経験はあまりないので、どのように動作しているのか少し考えなければならないでしょう! – barry

+0

私はそれを得ると思います。新鮮なリストのオブジェクトが新しいオブジェクトだったので、私はちょっと混乱しました。だから、以前のリストでどのようにindexOfを見つけることができますか?しかし、呼び出しのインデックスはRetrievedPageでオーバーライドされたequals()です。 – barry

+0

はい、正しい: 'indexOf()'メソッドは、同じオブジェクトを探すのではなく、類似のオブジェクトを探す方法を知るために 'equals()'をオーバーライドする必要があります。私はおそらく答えでそれを言ったはずです、私はこの情報を追加します。 – Malcolm