web-dev-qa-db-fra.com

Comment utiliser Collections.sort () en Java?

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?

41
jsfrocha

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());
59
NINCOMPOOP

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.

22
Gyanesh Sharma

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
}
6
threadfin

Utilisez la méthode qui accepte un Comparator lorsque vous souhaitez effectuer un tri dans un ordre autre que l'ordre naturel.

Collections.sort (Liste, Comparateur)

3
John B

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());
    }
0
Kashan