Hoe gebruik je Collections.sort() in Java?

Ik heb een object Recipedat Comparable<Recipe>:

implementeert

public int compareTo(Recipe otherRecipe) {
    return this.inputRecipeName.compareTo(otherRecipe.inputRecipeName);
}

Ik heb dat gedaan zodat ik de Listalfabetisch kan sorteren op de volgende manier:

public static Collection<Recipe> getRecipes(){
    List<Recipe> recipes = new ArrayList<Recipe>(RECIPE_MAP.values());
    Collections.sort(recipes);
    return recipes;
}

Maar nu, in een andere methode, laten we het getRecipesSort()noemen, ik wil dezelfde lijst sorteren maar numeriek, waarbij ik een variabele vergelijk die hun ID bevat. Om het nog erger te maken, is het ID-veld van het type String.

Hoe gebruik ik Collections.sort() om de sorteringen in Java uit te voeren?


Antwoord 1, autoriteit 100%

Gebruik deze methode Collecties.sort(Lijst,Vergelijker). Implementeer een Comparatoren geef deze door aan 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());
    }
}

Gebruik vervolgens de Comparatorals

Collections.sort(recipes,new RecipeCompare());

Antwoord 2, autoriteit 42%

Het antwoord van NINCOMPOOPkan eenvoudiger worden gemaakt met Lambda Expressions:

Collections.sort(recipes, (Recipe r1, Recipe r2) ->
r1.getID().compareTo(r2.getID()));

Na Java 8 zijn ook de comparatorconstructiemethoden geïntroduceerd in de Vergelijker-interface. Door deze te gebruiken, kan men dit verder terugbrengen tot1:

recipes.sort(comparingInt(Recipe::getId));

1Bloch, J. Effectieve Java(3eeditie). 2018. Punt 42, p. 194.


Antwoord 3, autoriteit 11%

Maak een vergelijker die de vergelijkingsmodus in zijn constructor accepteert en geef verschillende modi door voor verschillende scenario’s op basis van uw vereisten

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

}

Eigenlijk moet je voor getallen apart behandelen, kijk hieronder

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
}

Antwoord 4, Autoriteit 5%

Gebruik de methode die een Comparatoraccepteert wanneer u in iets anders dan natuurlijke bestelling wilt sorteren.

Collecties.Sort (lijst, comparator)


Antwoord 5

Sorteer de ongesorteerde hashmap in oplopende volgorde.

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

Other episodes