Java - tri des cravates groupées
Question
J'écris un programme Java dans lequel je souhaite trier un ensemble d'articles et obtenir les n-éléments n-haches de l'ensemble.La chose est que je veux que les éléments soient renvoyés regroupés par leur rang - donc si je veux les 3 éléments les plus élevés, mais il y a une cravate entre deux éléments pour la troisième place, le troisième résultat est une collection qui contientles deux éléments liés.
Je sais que je pourrais m'écrire moi-même, mais je me demande si cela a déjà été mis en œuvre ailleurs.Est-ce que quelqu'un connaît quelque chose comme ça?
La solution 2
C'est ce que j'ai fini par aller avec:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.google.common.collect.Ordering;
public final class Sorting {
private Sorting() {}
public static <T extends Comparable<? super T>> List<List<T>> rank(
Iterable<T> iterable, int nRanks) {
if (nRanks < 0) {
throw new IllegalArgumentException(Integer.toString(nRanks));
}
if (nRanks == 0) {
return new ArrayList<List<T>>();
}
Iterator<T> iter = Ordering.natural().sortedCopy(iterable).iterator();
List<List<T>> ret = new ArrayList<List<T>>();
if (iter.hasNext()) {
T prev = iter.next();
List<T> group = new ArrayList<T>();
group.add(prev);
ret.add(group);
int rank = 1;
while (iter.hasNext()) {
T next = iter.next();
if (prev.compareTo(next) > 0) {
rank++;
if (rank > nRanks) {
break;
}
group = new ArrayList<T>();
ret.add(group);
}
group.add(next);
prev = next;
}
}
return ret;
}
}
Autres conseils
sonne comme le Multimap de Google Collection pourrait être ce que vous êtes après.
Utilisez le "rang" comme clé lorsque vous insérez vos éléments.Puis triez les touches.