2015-08-11 1 views
0

J'ai la classe suivante:Comment puis-je sorte des objets Java dans lequel la méthode compareTo logiquement de l'objet ne doit pas être compatible avec la méthode equals?

public class EventPriority { 
    Event myEvent; 
    Double priority; 
} 

Cette classe encapsule logiquement un événement et de priorité. J'écris un cadre qui prendra n nombre de ces événements en entrée et il déclenchera les événements k supérieurs sur le total n; Je veux seulement top k événements avec la plus haute priorité.

Je pensais à y parvenir en ayant la classe EventPriority mettre en œuvre Comparable comme ceci:

@Override 
public int compareTo(EventPriority other) { 
    return other.priority.compareTo(priority); 
} 

et en utilisant un BoundedTreeSet qui a une taille maximum de k. Si l'insertion d'un élément fait que la taille de l'ensemble dépasse la taille maximale, il supprime le dernier élément de l'ensemble.

Cependant, deux objets de la classe EventPriority sont logiquement les mêmes si elles ont le même événement. Alors:

Event myCommonEvent = new Event(); 
EventPriority firstPriority = new EventPriority(myCommonEvent, 0.9); 
EventPriority secondPriority = new EventPriority(myCommonEvent, 0.1); 

Dans ce cas, firstPriority est logiquement le même que secondPriority, mais ils ont juste des valeurs différentes de priorité.

De tout ce que j'ai lu en ligne, ce n'est pas une bonne idée d'avoir le compareTo() méthode incompatible avec les égaux() méthode.

Alors, que puis-je faire dans ce cas?

+2

Mettre en oeuvre une coutume 'Comparator' et l'utiliser, le cas échéant. –

+0

Mais l'incohérence reste encore, non? Indépendamment du fait que j'utilise un comparateur personnalisé ou implémente Comparable, ils ne seront pas compatibles avec la méthode equals. – BunBit

+1

Bien sûr, mais cela ne fait pas partie de 'EventPriority'. Si vous avez besoin d'une logique de comparaison personnalisée, vous avez besoin d'une logique de comparaison personnalisée, il n'y a pas moyen de contourner cela. Le mieux que vous puissiez faire est de l'extraire vers un autre composant afin de ne pas confondre le type lui-même. –

Répondre

0

En supposant que vous avez un getter pour priority, Comparator.comparing() permet de créer un comparateur personnalisé simple:

Comparator<EventPriority> comparator = Comparator.comparing(EventPriority::getPriority); 
+0

Hmm .. Malheureusement, je n'ai pas encore mis à jour vers Java 8. – BunBit