Как использовать Collections.sort () в Java? (Конкретная ситуация)

Я получил объект Recipe который реализует Comparable :

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

Я сделал это, чтобы отсортировать List алфавиту следующим образом:

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

Но теперь, в другом методе, можно вызвать его getRecipesSort() , я хочу сортировать один и тот же список, но численно, сравнивая переменную, содержащую их идентификатор. Чтобы ухудшить ситуацию, поле ID имеет тип String .

Используйте этот метод Collections.sort (List, Comparator) . Внесите Компаратор и передайте его в Collections.sort().

 class RecipeCompare implements Comparator { @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()); } } 

Затем используйте Comparator как

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

Ответ, предоставляемый NINCOMPOOP, может быть упрощен с использованием выражений lambda:

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

Также введено после того, как Java 8 является методом построения компаратора в интерфейсе Comparator . Используя их, можно дополнительно уменьшить это до 1 :

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

1 Bloch, J. Эффективная Java (3- е издание). 2018. Пункт 42, стр. 194.

Создайте компаратор, который принимает режим сравнения в своем конструкторе и передает разные режимы для разных сценариев на основе вашего требования

 public class RecipeComparator implements Comparator { 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()); } } 

}

Фактически для чисел вам нужно обрабатывать их отдельно, проверьте ниже

 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 } 

Используйте метод, который принимает Comparator когда вы хотите сортировать что-то, кроме естественного порядка.

Collections.sort (List, Comparator)

Сортируйте несортированный hash-файл в порядке возрастания.

 // Sorting the list based on values Collections.sort(list, new Comparator>() { public int compare(Entry o1, Entry o2) { return o2.getValue().compareTo(o1.getValue()); } }); // Maintaining insertion order with the help of LinkedList Map sortedMap = new LinkedHashMap(); for (Entry entry : list) { sortedMap.put(entry.getKey(), entry.getValue()); } 
  • сортировка проблем с использованием функции-члена в качестве компаратора
  • Как отсортировать NSMutableArray с пользовательскими объектами в нем?
  • Как я могу отсортировать ArrayList строк в Java?
  • Как выполнить естественную сортировку?
  • Каковы правила сортировки по символам?
  • Сортировка двухмерного массива на основе одного столбца
  • Как отсортировать ArrayList, используя несколько критериев сортировки?
  • Тонирование и сортировка с помощью XSLT 1.0
  • Выполнение qsort vs std :: sort?
  • c ++ sort с structs
  • Получение информации о последовательном порту
  • Давайте будем гением компьютера.