2013-05-07 2 views
31

я получил объект, который реализует RecipeComparable<Recipe>:Как использовать Collections.sort() в Java? (Конкретная ситуация)

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 имеет тип String.

+1

http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html –

+1

@BrianRoach Я извиняюсь, если я не отвечают вашим требованиям для ответа. Я знаю, где находится документация, я просто ищу творческие решения, так как я не могу найти их. Даун-голосования было просто просто смешно, но, ну, разочарование не может быть объяснено. – jsfrocha

ответ

47

Используйте этот метод 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's just a sample 
     return o1.getID().compareTo(o2.getID()); 
    } 
} 

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

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

Почти.OP хочет сравнивать на основе полей ID, которые являются строками, но для сравнения их численно. Мы не знаем диапазон, но если они вписываются в ints, тогда преобразование в int и сравнение будет работать, в противном случае должен быть выбран подходящий тип или написан более сложный компаратор, но это правильный подход. –

+0

На самом деле, я как бы простота этого ответа, он заставлял меня думать, как я это сделаю, теперь я работаю над этим. – jsfrocha

3

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

Collections.sort(List, Comparator)

5

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

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 
} 
14

Ответ дается размазня можно сделать проще с помощью лямбда-выражения:

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

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

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

Блох, Дж Эффективное Java (3-й -е издание). 2018. Пункт 42, стр. 194.

0

Сортировка несортированной хэш-карты в порядке возрастания.

// 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()); 
    } 
Смежные вопросы