2017-04-07 2 views
0

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.

+0

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. –

Répondre

0

Comme indiqué, utiliser un comparateur. Le comparateur renvoie 0 sur égal. D'abord comparer sur le titre, si elles sont égales vous allez pour la comparaison sur le temps. Je n'ai pas couru le code, mais il devrait être quelque chose comme ceci:

private static final Comparator TASKHOLDERCOMPARATOR_DUEDATE = new Comparator<ViewHolder>() { 
    @Override 
    public int compare(ViewHolder a, ViewHolder b) { 
     int comparison = a.getTask().getTitle().compareToIgnoreCase(b.getTask().getTitle()); 

     if(comparison == 0){ 
      comparison = a.getTask().getDueTime().compareTo(b.getTask().getDueTime()); 
     } 
     return comparison; 
    } 
};