Tri imbriqué dans la liste Java basé sur deux éléments à l'aide de Comparateur


J'ai une liste java que je dois trier après y avoir ajouté des objets. l'objet a trois éléments. une chaîne et deux entiers. la classe est la suivante: -

public class ValueWords implements Comparable<ValueWords>{

//.............................................

public static final Comparator<ValueWords> valComparator = new Comparator<ValueWords>()
 {@Override
    public int compare(ValueWords v1, ValueWords v2) {
        return v1.valWord   - v2.valWord; }
   }
};
//....................................................................
private String strWord;
private int valWord;
private int phraseWord;
public int getPhraseWord() {
    return phraseWord;}
public void setPhraseWord(int phraseWord) {
    this.phraseWord = phraseWord;}
public String getStrWord() {
    return strWord;}
public void setStrWord(String strWord) {
    this.strWord = strWord;}
public int getValWord() {
    return valWord;}
public void setValWord(int valWord) {
    this.valWord = valWord;}
public ValueWords() {}

@Override
public int compareTo(ValueWords arg0) {
    // TODO Auto-generated method stub
    return 0;}
//..............................................
}

Je l'appelle comme ça

 Collections.sort(valWordList,ValueWords.valComparator);

, Il me donne la liste triée comme suit:-

 ---------------------------------------------
   strWord     valWord      phraseWord
   abcd          0             1
   abcde         0             0
   mns           1             2 
   efgh          1             1
   xyz           2             2
   zxx           2             0
  --------------------------------------------

Je veux un tri imbriqué comme: -

  ---------------------------------------------
   strWord     valWord      phraseWord
   abcde        0             0
   abcd         0             0
   efgh         1             1 
   mns          1             2
   zxx          2             0
   xyz          2             2
  --------------------------------------------

J'ai suivi quelques essais futiles mais étant nouveau sur java. ils n'ont pas de travail. et ils sont calmes primitifs pour être placés ici.

Author: jaykio77, 2014-11-26

2 answers

Essayez de changer votre comparateur pour vérifier les deux valeurs:

public static final Comparator<ValueWords> valComparator = new Comparator<ValueWords>() {
    @Override
    public int compare(ValueWords v1, ValueWords v2) {
        if(v1.valWord == v2.valWord)
            return v1.phraseWord - v2.phraseWord;
        else 
            return v1.valWord - v2.valWord;
    }
};
 1
Author: Ensar Hatipoglu, 2014-11-26 15:05:56

Vous pouvez combiner les deux dans un seul comparateur:

public static final Comparator<ValueWords> valComparator = new Comparator<ValueWords>()
{
    @Override
    public int compare(ValueWords v1, ValueWords v2) {
        int result = Integer.compare(v1.valWord, v2.valWord);
        return result == 0 ? Integer.compare(v1.phraseWord, v2.phraseWord) : result;
    }
};

En java 8+, vous pouvez également utiliser Comparator.thenComparing pour combiner les 2 comparateurs:

valComparator = ((Comparator<ValueWords>) (v1, v2) -> Integer.compare(v1.valWord, v2.valWord))
                                         .thenComparing((v1, v2) -> Integer.compare(v1.phraseWord, v2.phraseWord));
 1
Author: fabian, 2014-11-26 15:27:03