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.
2
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