2011-11-12 58 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

感謝馬爾科姆 - 我得到一個JUnit綠線,因此它的工作原理。我沒有比較器的很多經驗,所以我不得不思考它是如何工作的! – barry

+0

我想我明白了。它讓我感到困惑,因爲新列表中的對象是新對象,所以indexOf如何在前面的列表中找到它們。但是,調用索引equals(),我在RetrievedPage中覆蓋了它。 – barry

+0

是的,正確的:你應該重載'equals()',這樣'indexOf()'方法可以知道如何查找類似的對象,而不是完全針對同一個對象。我應該可能在答案中說過,我會添加這些信息。 – Malcolm