Как использовать Collections.sort() в Java?
Я получил объект Recipe
который реализует Comparable<Recipe>
:
public int compareTo(Recipe otherRecipe) {
return this.inputRecipeName.compareTo(otherRecipe.inputRecipeName);
}
Я сделал это, чтобы отсортировать List
алфавиту следующим способом:
public static Collection<Recipe> getRecipes(){
List<Recipe> recipes = new ArrayList<Recipe>(RECIPE_MAP.values());
Collections.sort(recipes);
return recipes;
}
Но теперь, в другом методе, давайте назовем его getRecipesSort()
, я хочу отсортировать тот же список, но численно, сравнивая переменную, которая содержит их ID. Что еще хуже, поле ID имеет тип String
.
Как мне использовать Collections.sort() для выполнения сортировки в Java?
Ответы
Ответ 1
Используйте этот метод Collections.sort(List, Comparator). Внесите Comparator и передайте его Collections.sort().
class RecipeCompare implements Comparator<Recipe> {
@Override
public int compare(Recipe o1, Recipe o2) {
// write comparison logic here like below , it just a sample
return o1.getID().compareTo(o2.getID());
}
}
Затем используйте Comparator
как
Collections.sort(recipes,new RecipeCompare());
Ответ 2
Ответ, данный NINCOMPOOP, можно упростить с помощью лямбда-выражений:
Collections.sort(recipes, (Recipe r1, Recipe r2) ->
r1.getID().compareTo(r2.getID()));
После Java 8 также представлены методы построения компаратора в интерфейсе Comparator. Используя их, можно еще уменьшить это до 1:
recipes.sort(comparingInt(Recipe::getId));
1 Блох, Дж. Эффективная Ява (3- е издание). 2018. П. 42, с. 194.
Ответ 3
Создайте компаратор, который принимает режим сравнения в своем конструкторе и передает разные режимы для разных сценариев на основе вашего требования
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());
}
}
}
Фактически для чисел вам нужно обрабатывать их отдельно, проверьте ниже
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
}
Ответ 4
Используйте метод, который принимает Comparator
, если вы хотите сортировать что-то, отличное от естественного.
Collections.sort(List, Comparator)
Ответ 5
Сортировка несортированной хэш-карты в порядке возрастания.
// 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());
}