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);
}
};
}
}
Pourquoi ne pas simplement remplacer compareTo? – jzd
.compareTo() de quelle classe voulez-vous dire? n'a pas .compareTo() –
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