2011-11-12 1 views
0

J'ai une liste Java d'objets qui est périodiquement effacée puis rechargée avec des versions mises à jour des objets d'une base de données. Avant de recharger, l'utilisateur peut avoir choisi de commander la liste d'une certaine manière. J'ai besoin de trouver un algorithme qui applique l'ordre de la liste précédente à la nouvelle liste.Copie de l'ordre d'un tableau dans un nouveau tableau

Je ne peux pas utiliser le comparateur car l'objet peut effectivement être dans un ordre aléatoire.

Voici mon talon de méthode:

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

    return freshCopyOfList; 
} 

Merci à l'avance, Barry

Répondre

2

Vous pouvez toujours utiliser un comparateur, il suffit de comparer les éléments en fonction de leur position dans la liste précédente.

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; 
    } 
}); 

Bien sûr, si vous avez des objets différents dans les listes, vous ne devriez pas oublier de passer outre equals() et hashCode() méthodes dans les objets que vous comparez. Sinon, la méthode indexOf() recherchera exactement le même objet et ne les testera pas pour l'égalité comme vous l'entendez.

+0

Merci Malcolm - Je reçois une ligne verte JUnit pour que ça fonctionne. Je n'ai pas beaucoup d'expérience de Comparator, donc je vais devoir réfléchir un peu sur comment ça marche! – barry

+0

Je pense que je comprends. Cela m'a dérouté un peu car les objets de la nouvelle liste étaient de nouveaux objets, alors comment indexOf peut-il les trouver dans la liste précédente. Mais, index des appels est égal à(), que j'ai remplacé dans RetrievedPage. – barry

+0

Oui, correct: vous devez surcharger 'equals()' pour que la méthode 'indexOf()' sache comment rechercher l'objet similaire, pas exactement pour le même objet. J'aurais probablement dû le dire dans la réponse, je vais ajouter cette information. – Malcolm

Questions connexes