J'ai un objet Recipe
qui implémente Comparable<Recipe>
:
public int compareTo(Recipe otherRecipe) {
return this.inputRecipeName.compareTo(otherRecipe.inputRecipeName);
}
C'est ce que j'ai fait, donc je peux trier List
par ordre alphabétique selon 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
.
Comment utiliser Collections.sort () pour effectuer les tris en Java?
Utilisez cette méthode Collections.sort (List, Comparator) . Implémentez un comparateur et transmettez-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 à l'aide d'expressions lambda:
Collections.sort(recipes, (Recipe r1, Recipe r2) ->
r1.getID().compareTo(r2.getID()));
La méthode de construction du comparateur dans l'interface Comparateur est également introduite après Java 8). L'utilisation de ces méthodes permet de réduire ce nombre à 1:
recipes.sort(comparingInt(Recipe::getId));
1 Bloch, J. Effective Java (3rd Édition). 2018. Point 42, p. 194.
Créez un comparateur qui accepte le mode de comparaison dans son constructeur et passez 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 numéros que vous devez manipuler 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 effectuer un tri dans un ordre autre que l'ordre naturel.
Triez la table de hachage non triée par 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());
}