2017-03-05 1 views
-3

En prenant par exemple ces extraits de code:Comment la variable this.method diffère-t-elle de object.method lors de la comparaison de deux objets avec l'interface Comparable?

public int compareTo(DSA_Student C){ 
    if (this.getName().compareTo(C.getName())<0) return -1; 
    else 
     if (this.getName().compareTo(C.getName())>0) return 1; 
     else return (new Integer(this.getStudentId()).compareTo(new Integer(C.getStudentId()))); 
} 

Dans la classe principale:

SortedSet <DSA_Student> S1=new TreeSet<DSA_Student>(); 
    DSA_Student a=new DSA_Student("A",10); 
    DSA_Student b=new DSA_Student("F",40); 
    DSA_Student c=new DSA_Student("B",49); 
    DSA_Student d=new DSA_Student("E",45); 
    DSA_Student e=new DSA_Student("D",30); 
    DSA_Student f=new DSA_Student("C",45); 
    DSA_Student g=new DSA_Student("B",45); 

    S1.add(a); 
    S1.add(b); 
    S1.add(c); 
    S1.add(d); 
    S1.add(e); 
    S1.add(f); 
    S1.add(g); 

Je veux savoir ce que font référence à et comment this.getName() et C.getName() fait le compilateur sait qu'ils sont deux objets différents et font ainsi la comparaison?

+0

Le compilateur ** ne sait pas ** qu'ils se réfèrent à deux objets différents, mais qu'ils se réfèrent à l'objet 'this' et à tout objet référencé par le paramètre C (mal nommé). Ils pourraient en fait être un seul et même objet, ou C peut en fait être une référence nulle. –

+0

'this' est l'instance sur laquelle' compareTo' est appelée; 'C' est le paramètre qui a été passé. Par exemple, dans 'a.compareTo (b)' 'this' est' a', 'C' est' b'. –

+0

Note: 'compareTo' n'est pas appelé du tout, parce que vous passez un' Comparator', sauf si 'Comparator' arrive à appeler' compareTo'. –

Répondre

2

this.getName() signifie obtenir le nom de son propre objet

C.getName() signifie obtenir le nom de l'objet c

méthode compareTo utilisé pour se comparer à d'autres objets passés

Interface Comparable fournit la déclaration de méthode pour comparer sa propre objet à l'autre objet transmis dans sa méthode compareTo.

Mise à jour:

Comme vous l'avez demandé que le mécanisme de travail de TreeSet en utilisant la méthode compareTo Comparable, il est préférable de regarder dans le code source de TreeMap comme TreeSet utiliser en interne TreeMap méthode de vente lors de l'ajout objet. Lorsque TreeSet conserve son élément dans l'ordre trié, il le trie dès qu'il y a ajout d'élément dans TreeSet. Vous pouvez avoir source code of TreeMap put method here. J'ai pris uniquement la mise en œuvre pertinente de la méthode put qui est liée à l'utilisation ComparablecompareTo méthode:

  if (key == null) 
       throw new NullPointerException(); 
      // This is where it takes your custom comparable object 
      Comparable<? super K> k = (Comparable<? super K>) key; // 
      do { 
       parent = t; 
       // k as current object compareTo other object as 
       // t has been taken as root which changes 
       //its position based on comparsion 
       cmp = k.compareTo(t.key); 
       if (cmp < 0) 
        t = t.left; 
       else if (cmp > 0) 
        t = t.right; 
       else 
        return t.setValue(value); 
      } while (t != null); 

Comme je ne suis pas expert Java, je serais heureux de voir tout commentaire sur ma mise à jour pour vous assurer que les informations est correct.

+0

J'ai obtenu ceci, mais ne pas 'this.getName()' et 'C.getName()' deux pointent vers les objets ajoutés à TreeSet? Comment le compilateur sait-il DSA_Student a = new DSA_Student ("A", 10); 'ou ' DSA_Student b = nouveau DSA_Student ("F", 40); 'fait référence à' this.getName() 'ou' C. getName() '? – Tia

+0

@Diksha: J'ai mis à jour mon post pour répondre à votre requête dans un commentaire. –