2013-05-07 9 views
31

Mam obiektu Recipe który implementuje Comparable<Recipe>:Jak korzystać z Collections.sort() w Javie? (Specyficzna sytuacja)

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

Zrobiłem tak, że jestem w stanie uporządkować List alfabetycznie w następujący sposób:

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

Ale teraz, w innej metodzie, możemy nazwać to getRecipesSort(), chcę posortować tę samą listę, ale numerycznie, porównując zmienną, która zawiera ich ID. Aby pogorszyć sytuację, pole ID jest typu String.

+1

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

+1

@BrianRoach Przepraszam, jeśli nie spełniają wymagań dla sekretarki. Wiem, gdzie jest dokumentacja, szukam tylko kreatywnych rozwiązań, ponieważ nie mogę znaleźć żadnego. Głosowanie w dół było po prostu absurdalne, ale cóż, frustracji nie można wytłumaczyć. – jsfrocha

Odpowiedz

47

Użyj tej metody Collections.sort(List,Comparator). Wdrożenie Comparator i przekazać go do 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()); 
    } 
} 

Następnie użyj Comparator jak

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

Prawie.OP chce porównać na podstawie pól ID, które są łańcuchami, ale porównać je liczbowo. Nie znamy zakresu, ale jeśli pasują one do ints, to konwersja do int i porównywanie zadziała, w przeciwnym razie należałoby wybrać odpowiedni typ lub bardziej skomplikowany komparator, ale jest to właściwe podejście. –

+0

Właściwie to lubię prostotę tej odpowiedzi, to sprawiło, że pomyślałem, jak to zrobię, teraz nad tym pracuję. – jsfrocha

5

Tworzenie komparator który przyjmuje tryb porównać jej konstruktora i przekazać różne tryby dla różnych scenariuszy na podstawie zapotrzebowania

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

}

Faktycznie numerów trzeba obsłużyć osobno sprawdź poniżej:

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

Odpowiedź podaje gamoń mogą być wykonane prościej za pomocą lambda wyrażeń:

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

Wprowadzono również po Java 8 metod budowlanych komparator interfejsu Comparator. Na ich podstawie, można dodatkowo zredukować do :

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

Bloch, J. Skuteczna Java (3 III wydanie). 2018. Pkt 42, str. 194.

0

Posortuj niesortowaną mieszańca w porządku rosnącym.

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