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.

Author: Yu Hao, 2013-05-07

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());
 51
Author: NINCOMPOOP, 2013-05-07 17:39:32

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.

 14
Author: Gyanesh Sharma, 2018-02-06 19:46:02

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
}
 5
Author: threadfin, 2013-05-07 18:10:10

Utilisez la méthode qui accepte un Comparator lorsque vous souhaitez trier autre chose que l'ordre naturel.

Les Collections.trier (Liste, comparateur)

 3
Author: John B, 2013-05-07 17:34:28

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());
    }
 0
Author: Kashan, 2017-05-31 23:12:36