I got an object Recipe that implements Comparable<Recipe> :

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

I've done that so I'm able to sort the List alphabetically in the following method:

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

But now, in a different method, lets call it getRecipesSort(), I want to sort the same list but numerically, comparing a variable that contains their ID. To make things worse, the ID field is of the type String.

How do I use Collections.sort() to perform the sorts in Java?

2

5 Answers

Use this method Collections.sort(List,Comparator) . Implement a Comparator and pass it to 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()); } } 

Then use the Comparator as

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

The answer given by NINCOMPOOP can be made simpler using Lambda Expressions:

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

Also introduced after Java 8 is the comparator construction methods in the Comparator interface. Using these, one can further reduce this to 1:

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

1 Bloch, J. Effective Java (3rd Edition). 2018. Item 42, p. 194.

Create a comparator which accepts the compare mode in its constructor and pass different modes for different scenarios based on your requirement

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

}

Actually for numbers you need to handle them separately check below

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 } 

Use the method that accepts a Comparator when you want to sort in something other than natural order.

Collections.sort(List, Comparator)

Sort the unsorted hashmap in ascending order.

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy