2017-10-16 5 views
0

J'ai besoin d'aide les gars. Existe-t-il une meilleure version pour comparer deux génériques dans cette classe "TreeBag"?Meilleure alternative pour comparer deux génériques dans ma classe.

Ma solution actuelle est en train de faire ceci:

public class TreeBag<T> implements Bag<T>, Comparator<T> { 
. 
. 
. 
    @Override 
    public int compare(T o1, T o2) { 
     int temp = Integer.parseInt(o1.toString()) - Integer.parseInt(o2.toString()); 
     if (temp < 0) 
      return -1; 
     else if (temp > 0) 
      return 1; 
     else 
      return 0; 
    } 

That`s ma solution actuelle. Mais je fais quelque chose qui est une solution très inesthétique. Y a-t-il une meilleure solution pour ce problème?

Merci

+2

Ce que vous fait penser à un arbitraire '' T' toString' retournera quelque chose qui peut être analysé à un 'int'? –

+0

Que voulez-vous comparer par? – Neo

+0

si vous comparez 'ints' vous pouvez faire' return Integer.compare (Integer.parseInt (...), Integer.parseInt (...)); ' – azro

Répondre

1

Votre TreeBag ne devrait pas essayer d'être un comparateur, il devrait avoir un comparateur:

public class TreeBag<T> implements Bag<T> { 
    private final Comparator<? super T> comparator; 

    public TreeBag(Comparator<? super T> comparator) { 
     this.comparator = Objects.requireNonNull(comparator, "comparator"); 
    } 

    /// and somewhere 
    void somewhere() { 
     T o1 = ....; 
     T o2 = ....; 

     int rc = comparator.compare(o1, o2); 
     if (rc < 0) { 
     } else if (rc > 0) { 
     } else { 
     } 
    } 
} 

A TreeBag<String> serait alors par exemple être créé avec new TreeBag<String>(String.CASE_INSENSITIVE_ORDER);. Un TreeBag<Integer> sera alors créé avec new TreeBag<Integer>(Comparator.naturalOrder());.

0

Afin de faire une comparaison appropriée, le comparateur DOIT savoir ce qui doit être comparé.

Plusieurs façons d'améliorer votre conception:

  1. Utilisez <T extends Comparable> et utiliser o1.compareTo(o2)
  2. Utilisez <T extends YourDomainObject> et écrire une logique spécifique pour YourDomainObject dans compare méthode
  3. Faire TreeBag abstraite et écrire une logique spécifique pour YourDomainObject dans compare méthode de la classe concrète: MyTreeBag extends TreeBag<YourDomainObject> { ...
  4. Fournir un comparateur pour TreeBag
  5. Et ainsi de suite