2011-01-27 2 views
0

Dans mon application, je dois garder la collection résultant dans le même ordre que demandé (l'utilisateur envoie une liste de ce qu'il veut et il est souhaitable de lui répondre dans le même ordre).copie ordre entre les collections

Données, ce que je vais envoyer à l'utilisateur est généré par les couches sous-jacentes, et ils ne connaissent ni l'ordre correct, ni générer un résultat ordonné. Je dois donc le commander moi-même.

Mon approche est la suivante, mais je pense qu'il n'est pas nécessaire de l'implémenter, car il devrait y avoir un moyen standard. Alors, que recommanderiez-vous?

public class KeepOrder { 

/** 
* Knows how to extract A from B. 
* 
* @param <A> 
* @param <B> 
*/ 
public interface Extractor<A, B> { 

    A extract(B from); 

} 

@SuppressWarnings("serial") 
public static <T, F> Collection<T> keepOrder(final Collection<T> data, final Collection<F> order, 
     final Extractor<F, T> extractor) { 

    final Comparator<T> tComparator = new Comparator<T>() { 

     @Override 
     public int compare(final T o1, final T o2) { 

      final F field1 = extractor.extract(o1); 
      final F field2 = extractor.extract(o2); 

      for (final F currentField : order) { 
       if (currentField.equals(field1) && currentField.equals(field2)) { 
        return 0; 
       } 

       if (currentField.equals(field1)) { 
        return -1; 
       } 

       if (currentField.equals(field2)) { 
        return 1; 
       } 
      } 

      return 0; 
     } 
    }; 

    return new TreeSet<T>(tComparator) { 
     { 
      addAll(data); 
     } 
    }; 

} 

}

+0

Pourquoi ne pas simplement remplacer compareTo? – jzd

+0

.compareTo() de quelle classe voulez-vous dire? n'a pas .compareTo() –

+0

Ceci est en fait assez similaire à une question que j'ai demandé- [comment puis-je réorganiser une collection en fonction d'une liste connexe d'ids] (http://stackoverflow.com/questions/10802096/reordering -a-collection-selon-une-related-list-of-ids). Il est possible que les réponses vous aident - elles m'ont certainement aidé! – Eyal

Répondre

5

Si l'ordre est important dans votre collection, vous devez vous limiter à List s.

De the documentation of List:

Une collection ordonnée (également connu en tant que séquence). L'utilisateur de cette interface a un contrôle précis sur l'endroit où chaque élément est inséré dans la liste. L'utilisateur peut accéder aux éléments par leur index entier (position dans la liste), et rechercher des éléments dans la liste.

+0

Oui, mais j'ai oublié d'ajouter à ma question, que les données, ce que je vais envoyer à l'utilisateur est généré par les couches sous-jacentes, et ils ne connaissent ni l'ordre correct, ni générer un résultat ordonné. Je dois donc le commander moi-même. Pas de tri mais d'ordre. –

+0

Ensuite, faites quelque chose comme 'new ArrayList (unorderedCollection)'. – aioobe

Questions connexes