je suis en train de trier mes Arrayadapter avec son tri Méthodetri secondaire sur ArrayAdapter
@Override
public void sort(@NonNull Comparator<? super Task> comparator) {
super.sort(comparator);
}
deux fois.
J'utilise les deux Comparateurs
private static final Comparator TASKCOMPARATOR_TITLE = new Comparator<Task>() {
@Override
public int compare(Task a, Task b) {
return a.getTitle().compareToIgnoreCase(b.getTitle());
}
};
private static final Comparator TASKHOLDERCOMPARATOR_DUEDATE = new Comparator<ViewHolder>() {
@Override
public int compare(ViewHolder a, ViewHolder b) {
return a.getTask().getDueTime().compareTo(b.getTask().getDueTime());
}
};
comme celui-ci
taskAdapter.sort(Util.getTASKCOMPARATOR_TITLE());
taskAdapter.sort(Util.getTASKCOMPARATOR_DUEDATE());
espérant le tri secondaire ArrayAdapter par le titre, puis par la date. Le tri Méthode de l'ArrayAdapter utilise en interne
public void sort(Comparator<? super T> comparator) {
synchronized (mLock) {
if (mOriginalValues != null) {
Collections.sort(mOriginalValues, comparator);
} else {
Collections.sort(mObjects, comparator);
}
}
if (mNotifyOnChange) notifyDataSetChanged();
}
J'ai lu, que Collections.sort() utilise un algorithme stable et donc je me demande pourquoi la liste de mes ArrayAdapter vient d'être trié par le dernier comparateur que j'appelle. Est-ce que quelqu'un peut me dire où j'ai fait une erreur et pourquoi le premier sort() - appel est ignoré par le second?
EDIT
private static final Comparator TASKCOMPARATOR = new Comparator<Task>() {
@Override
public int compare(Task a, Task b) {
int timeCompareResult = a.getDueTime().compareTo(b.getDueTime());
if (timeCompareResult == 0) {
return a.getTitle().compareToIgnoreCase(b.getTitle());
} else {
return timeCompareResult;
}
}
};
Cela fonctionne. Je ne sais pas si c'est le seul/meilleur moyen.
Il suffit d'utiliser un comparateur et trier par deux paramètres là-bas. Si les titres sont identiques, trier par date. C'est élémentaire. Vous pouvez également l'abstraire et écrire un comparateur universel qui accepte deux comparateurs internes. –