Comment utiliser les collections.trier () en Java? (Situation spécifique)
, j'ai reçu un objet Recipe
qui implémente Comparable<Recipe>
:
public int compareTo(Recipe otherRecipe) {
return this.inputRecipeName.compareTo(otherRecipe.inputRecipeName);
}
Je l'ai fait donc je suis capable de trier le List
par ordre alphabétique dans la méthode suivante:
public static Collection<Recipe> getRecipes(){
List<Recipe> recipes = new ArrayList<Recipe>(RECIPE_MAP.values());
Collections.sort(recipes);
return recipes;
}
Mais maintenant, dans une méthode différente, appelons-le getRecipesSort()
, je veux trier la même liste mais numériquement, en comparant une variable qui contient leur ID. Pour aggraver les choses, le champ ID est du type String
.
5 answers
Utilisez cette méthode Collections.trier (Liste,comparateur) . Implémentez un Comparateur et passez-le à Collections.sort().
class RecipeCompare implements Comparator<Recipe> {
@Override
public int compare(Recipe o1, Recipe o2) {
// write comparison logic here like below , it's just a sample
return o1.getID().compareTo(o2.getID());
}
}
Puis utilisez le Comparator
comme
Collections.sort(recipes,new RecipeCompare());
La réponse donnée par NINCOMPOOP peut être simplifiée en utilisant des expressions Lambda:
Collections.sort(recipes, (Recipe r1, Recipe r2) ->
r1.getID().compareTo(r2.getID()));
Les méthodes de construction du comparateur dans l'interface Comparator sont également introduites après Java 8. En utilisant ceux-ci, on peut encore réduire cela à 1:
recipes.sort(comparingInt(Recipe::getId));
1 Bloch, J. Java efficace (3rd Édition). 2018. Point 42, p. 194.
Créez un comparateur qui accepte le mode de comparaison dans son constructeur et transmettez différents modes pour différents scénarios en fonction de vos besoins
public class RecipeComparator implements Comparator<Recipe> {
public static final int COMPARE_BY_ID = 0;
public static final int COMPARE_BY_NAME = 1;
private int compare_mode = COMPARE_BY_NAME;
public RecipeComparator() {
}
public RecipeComparator(int compare_mode) {
this.compare_mode = compare_mode;
}
@Override
public int compare(Recipe o1, Recipe o2) {
switch (compare_mode) {
case COMPARE_BY_ID:
return o1.getId().compareTo(o2.getId());
default:
return o1.getInputRecipeName().compareTo(o2.getInputRecipeName());
}
}
}
En fait, pour les nombres, vous devez les gérer séparément, vérifiez ci-dessous
public static void main(String[] args) {
String string1 = "1";
String string2 = "2";
String string11 = "11";
System.out.println(string1.compareTo(string2));
System.out.println(string2.compareTo(string11));// expected -1 returns 1
// to compare numbers you actually need to do something like this
int number2 = Integer.valueOf(string1);
int number11 = Integer.valueOf(string11);
int compareTo = number2 > number11 ? 1 : (number2 < number11 ? -1 : 0) ;
System.out.println(compareTo);// prints -1
}
Utilisez la méthode qui accepte un Comparator
lorsque vous souhaitez trier autre chose que l'ordre naturel.
Trie le hashmap non trié dans l'ordre croissant.
// Sorting the list based on values
Collections.sort(list, new Comparator<Entry<String, Integer>>() {
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2)
{
return o2.getValue().compareTo(o1.getValue());
}
});
// Maintaining insertion order with the help of LinkedList
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
for (Entry<String, Integer> entry : list) {
sortedMap.put(entry.getKey(), entry.getValue());
}