2011-07-17 3 views
1

J'ai cette classe:Java, Mutliple/Comparable différents implenetations de méthode compareTo()

public class Sample implements Comparable<Sample> { 
public String a; 
public String b; 
public String c; 

public int compareTo (Sample sampleToCompare) { 
int compResult = this.a.compareTo(sampleToCompare.a); 
     return (compResult != 0 ? compResult : 
        this.b.compareTo(sampleToCompare.b));  
    } 
} 

Je veux compareTo() à son comportement ou trier en utilisant différentes propriétés de classe en fonction si un indicateur est défini.

Donc, si flag == 1 je voudrais compareTo() à l'utilisation de la propriété c, est par ailleurs flag == 0, tout ce qui est actuellement dans la méthode. En d'autres termes, triez la même classe de différentes manières.

Je ne sais pas comment y parvenir. S'il vous plaît aider.

Aussi, s'il vous plaît laissez-moi savoir si plus d'informations sont nécessaires de mon côté.

Répondre

3

Que diriez-vous:

public int compareTo(Sample sampleToCompare) { 
    if (flag == 1) { 
     return this.c.compareTo(sampleToCompare.c); 
    } 
    if (flag == 0) { 
     // current stuff 
    } 
    ... 
} 

Ce n'est pas une façon très orientée objet pour le faire, cependant. Probablement, vous devriez avoir deux comparateurs différents et un moyen de les sélectionner en fonction de votre valeur "drapeau". Quelque chose comme:

class Sample { 
    private String a; 
    private String b; 
    private String c; 
} 

class ASampleComparator implements Comparator<Sample> { 
    public int compare(Sample o1, Sample o2) { 
     return o1.a.compareTo(o2.a); 
    } 
} 

class BSampleComparator implements Comparator<Sample> { 
    public int compare(Sample o1, Sample o2) { 
     return o1.b.compareTo(o2.b); 
    } 
} 

class CSampleComparator implements Comparator<Sample> { 
    public int compare(Sample o1, Sample o2) { 
     return o1.c.compareTo(o2.c); 
    } 
} 

public Comparator<Sample> pickComparator(int flag) { 
    switch (flag) { 
     case 0: 
      return new ASampleComparator(); 
     case 1: 
      return new BSampleComparator(); 
     case 2: 
      return new CSampleComparator(); 
     default: 
      throw new IllegalArgumentException("Bad flag value: " + flag); 
    } 
} 
+0

Pouvez-vous me donner un exemple de comparaison? Sachant que a, b, c sont Chaînes –

+0

@Sabertooth: Réponse mise à jour avec un exemple de Comparateur –

1

Vous devriez faire votre drapeau statique de sorte que la comparaison sera conforme (tel que décrit dans Effective Java, item 12), sinon, vous pourriez obtenir que a.compareTo(b) rendements a > b, mais b.compareTo(a) rendements b > a. Ainsi, la simple mise en œuvre que je peux penser est:

public class Sample implements Comparable<Sample> { 
public String a; 
public String b; 
public String c; 
public static boolean my_flag = false; 

public int compareTo (Sample sampleToCompare) { 
    if (flag) { 
     return this.c.compareTo(sampleToCompare.c); 
    } 
    int compResult = this.a.compareTo(sampleToCompare.a); 
     return (compResult != 0 ? compResult : 
        this.b.compareTo(sampleToCompare.b));  
    } 
} 
+0

Je n'achète pas la partie 'static'. 'final': oui. 'static': pas nécessaire. –

+0

@Jason - pourquoi le rendre final, si cela pouvait changer? Et pourquoi pas statique? J'aimerais vraiment avoir une réponse, car il me manque peut-être quelque chose. – MByD

+0

#MByD: mon mauvais, je pensais à 'Comparator', pas' Comparable', où vous pourriez vouloir avoir différents. En ce qui concerne 'final', vous ne voulez vraiment pas coller des objets comme des clés dans un TreeMap et changer les règles au milieu. –

4

Si vous souhaitez implémenter différents types de tri, vous devriez jeter un oeil à l'interface java.util.Comparator.

public class SampleComparatorA implement Comparator<Sample> { 

    public int compare(Sample a, Sample b) { 
     // Your sorting 
    } 
} 

Et utiliser java.util.Collections.sort() méthode avec le paramètre comme Comparator secound à la place.

Collections.sort(aSampleList, new SampleComparatorA()); 
+0

Il existe un exemple associé [ici] (http://stackoverflow.com/questions/5064027/sorting-2d-array-of-string- in-java/5064357 # 5064357). – trashgod

Questions connexes