2016-12-06 1 views
-1

Pour une raison quelconque, mon comparateur n'est pas accepté par mon jeu d'arbres. Aidez-moi, s'il vous plaît?Java Treeset: "Impossible de résoudre le constructeur" pour le comparateur

classe TreeSet:

public class PQTreeQueue<Integer> extends AbstractQueue<Integer>{ 

private TreeSet<Integer> _pqTree; 

public PQTreeQueue() { 
    noZeroComparator noZero = new noZeroComparator(); 
    _pqTree = new TreeSet<Integer>(noZero); 
} 

classe Comparator (définie dans un autre fichier)

public class noZeroComparator implements Comparator<Integer> { 

@Override 
public int compare(Integer e0, Integer e1) { 
    if (e0.compareTo(e1) >= 0) { 
     return -1; 
    } else { 
     return 1; 
    } 
} 
+1

Note de côté: un comparateur qui ne retourne jamais 0 n'est pas un comparateur valide. Je ne sais pas ce que vous essayez d'accomplir en écrivant un comparateur qui ne retourne jamais 0, mais cela posera des problèmes. – ajb

+0

J'ai ajouté une note à ma réponse pour expliquer pourquoi ce comparateur n'est pas valide. – ajb

Répondre

0

Vous avez défini TreeSet avec le paramètre générique entier. Le constructeur TreeSet que vous avez spécifié a besoin de comparator dont le paramètre générique est super type de Integer ou Integer lui-même. Définition de ce constructeur: -

TreeSet<E>(comparator<? super E>); 

donc mieux vous ne passez pas entier en tant que paramètre générique TreeSet. Créez votre propre classe comme Integer puis créez comparator avec le paramètre générique comme votre propre classe à comparator, et la même classe que le paramètre générique à votre classe d'entier personnalisé.

public class MyInterger { 
    int value = 0; 

     public int compareTo(MyInterger anotherInteger) { 
      return compare(this.value, anotherInteger.value); 
     } 

     public static int compare(int x, int y) { 
      return (x < y) ? -1 : ((x == y) ? 0 : 1); 
     } 
} 


public class noZeroComparator implements Comparator<MyInterger> { 

@Override 
public int compare(MyInterger e0, MyInterger e1) { 
    if (e0.compareTo(e1) >= 0) { 
     return -1; 
    } else { 
     return 1; 
    } 
} 

} 



public class PQTreeQueue<MyInterger> extends AbstractQueue<MyInterger>{ 

private TreeSet<MyInterger> _pqTree; 

public PQTreeQueue() { 

    noZeroComparator noZero = new noZeroComparator(); 
    _pqTree = new TreeSet<MyInterger>(noZero); 
} 
+0

Pas la bonne réponse. – ajb

+0

Pourquoi cela? L'utilisateur veut avoir une comparaison personnalisée, il/elle ne veut pas retourner 0, juste -1 ou 1. Votre code peut-il y parvenir? – vvtx

+0

voter en bas sans se soucier d'expliquer? Pas cool. – vvtx

0

L'erreur est sur cette ligne:

public class PQTreeQueue<Integer> extends AbstractQueue<Integer> 

Ce (la première partie) est la syntaxe pour déclarer une classe générique. Lorsque vous déclarez une classe générique, l'identificateur entre chevrons est un paramètre de type . Il est comme la déclaration en Java

public class ArrayList<E> ... 

sauf que vous avez appelé votre paramètre de type Integer au lieu de E. Le compilateur traite Integer de la même manière qu'il traite E, cependant - il devient un paramètre de type qui peut être remplacé par n'importe quel type réel, et le fait que le nom Integer soit utilisé pour d'autres choses en Java n'a pas de sens. Le type générique perd toute connexion avec Integer. Et partout ailleurs dans cette classe, Integer fera référence à la variable de type, pas à la réelle java.lang.Integer.

Si vous supprimez <Integer>:

public class PQTreeQueue extends AbstractQueue<Integer> 

tout devrait fonctionner. (.? Mis à part le fait qu'un comparateur qui ne retourne jamais 0 ne fonctionnera pas ce qui arriverait si vous appelez compare(x, x) Est-ce que ça va dire que x > x?)

Plus informations sur les exigences de comparateurs: La mathématique les règles sont qu'un comparateur impose un ordre total, ce qui signifie que la fonction doit obéir aux règles pour un ordre total (y compris la transitivité). Selon the javadoc for compare(), "L'implémenteur doit s'assurer que sgn(compare(x, y)) == -sgn(compare(y, x)) pour tout x et y." Cela signifie, en particulier, que sgn(compare(x,x)) == -sgn(compare(x,x)), et cela n'est possible que si compare(x,x) == 0. Cela prouve qu'un comparateur qui ne renvoie jamais 0 viole les règles, puisque compare doit renvoyer 0 lorsque les deux arguments sont ==. [La règle est plus faible en ce qui concerne les arguments qui ne sont pas == mais sont égaux selon .equals(); le javadoc ne dit pas que vous ne devez pas le faire, mais il dit que cela pourrait provoquer des choses comme des ensembles et des cartes triés à se comporter étrangement.Voir http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html.]