2013-01-23 6 views
0

Je veux atteindre ce qui suit, j'ai une collection de dates dans une forme de liste que je veux dédupliquées et triées. J'utilise collections.sort pour trier la liste dans l'ordre croissant des dates, puis en utilisant treeSet pour copier et dédoubler des éléments de la liste. C'est une approche à deux coups? Y a-t-il une approche plus rapide, en une étape? Fondamentalement, je veux commander l'objet Metadata basé sur le sourceDate et dédupliquer aussi.Trier et dedupe java collections

Répondre

3

Vous pouvez ignorer l'étape Collections#sort: TreeSet supprimera les doublons et triera les entrées. Donc, fondamentalement, il est une opération d'une ligne:

Set<Date> sortedWithoutDupes = new TreeSet<Date> (yourList); 

Si la date est un champ dans votre objet, vous pouvez:

  • ont votre objet de mettre en œuvre des objets Comparable et comparer en fonction de leur date
  • ou passer un Comparator<YourObject> comme argument au constructeur TreeSet, dans les deux cas, trie vos objets par date

vous n'avez pas besoin d'effectuer une pré-tri yo ur liste.

REMARQUE IMPORTANTE:

TreeSet utilise compareTo pour comparer les clés. Donc si 2 clés ont la même date mais des noms différents, vous devez vous assurer que votre méthode compare ou compareTo renvoie une valeur non-0, sinon les 2 objets seront considérés égaux et un seul sera inséré.

EDIT

Le code pourrait ressembler à ceci (non testé + vous devez gérer les valeurs NULL):

Comparator<Metadata> comparator = new Comparator<Metadata>() { 
    @Override 
    public int compare(Metadata o1, Metadata o2) { 
     if (o1.sourceDate.equals(o2.sourceDate)) { 
      return o1.name.compareTo(o2.name); 
     } else { 
      return o1.sourceDate.compareTo(o2.sourceDate); 
     } 
    } 
}; 

Set<Metadata> sortedWithoutDupes = new TreeSet<Metadata> (comparator); 
sortedWithoutDupes.addAll(yourList); 
+0

Mais que se passe-t-il si la date est un champ dans mon objet? Puis treeets peut-il le classer par ordre croissant de dates? – Phoenix

+0

@Phoenix C'est légèrement différent mais ça marche toujours - voir mon edit. – assylias

0

TreeSet triera automatiquement ses éléments, vous devriez donc pas besoin de trier les liste avant d'ajouter à l'ensemble.

+0

Mais le constructeur de jeu d'arbres ne permet qu'une seule chose, soit la déduplication ou l'ordre et pas les deux. Comment puis-je faire cela en une seule fois car j'ai besoin de copier les éléments d'une liste existante? – Phoenix

+0

Définit toujours dedupe, il est impossible pour eux de contenir des doublons - du moins c'est une exigence de l'interface. Ils le feront automatiquement avec n'importe quel constructeur ou toute opération d'ajout. –

Questions connexes