2017-05-26 2 views
2

Ich habe Array-Liste mit Kleidung Größen in dieser Reihenfolge: "L", "M", "XL", "XS", "S", "XXL" und ich muss nach rechts setzen Reihenfolge wie folgt: "XS", "S", "M", "L", "XL", "XXL".Array-Liste mit benutzerdefinierten Eigenschaften

Collections.sort(arrayList); 

wird die Arbeit tun, wenn ich mit diesem Beispiel habe Array: "38", "36", "34", "40", aber nicht mit dem oben genannten. Also habe ich mich entschieden, dies mit for-Schleife zu tun und Elemente innerhalb der Array-Liste zu tauschen und sie an die richtige Stelle zu setzen, aber da die Größe der Array-Liste dynamisch geändert wird, kann ich nicht sicher wissen, welche Position ich zuweisen soll.

Ich bin mir ziemlich sicher, dass dies vielleicht nicht der richtige Weg ist, aber ich bin offen für Vorschläge, wie das gelöst werden kann.

Hier ist ein Teil des Codes:

// Sample clothing sizes 
    List<String> availableSizes = new ArrayList<>(tempSizes); 
    // Sorting array, only works for "34", "38", "36" and etc 
    Collections.sort(availableSizes); 

    if (availableSizes.size() > 0) { 
     for (int i = 0; i < availableSizes.size(); i++) { 
      if (availableSizes.get(i).equals("XS")) { 
       Collections.swap(availableSizes, i, 0); 
      } else if (availableSizes.get(i).equals("S")) { 
       Collections.swap(availableSizes, i, 1); 
      } else if (availableSizes.get(i).equals("M")) { 
       Collections.swap(availableSizes, i, 2); 
      } else if (availableSizes.get(i).equals("L")) { 
       Collections.swap(availableSizes, i, 3); 
      } else if (availableSizes.get(i).equals("XL")) { 
       Collections.swap(availableSizes, i, 4); 
      } else if (availableSizes.get(i).equals("XXL")) { 
       Collections.swap(availableSizes, i, 5); 
      } 
     } 
    } 

Offensichtlich werde ich eine Fehlermeldung erhalten, wenn Array-Größe von weniger als fünf.

+0

gibt es einen Vorschlag, den Sie eine Liste der Pojo sagen Liste in Größe zwei-Mitglied setzen erstellen sizeInCms, sizeInLetters, jetzt können Sie es leicht mit sizeinCms sortieren, da es eine Ganzzahl ist und Ihre li st sortierte –

+0

Aber ich bekomme nicht sowohl sizesInCm und sizesInLetters. Entweder wird in cms oder in Briefen sein. –

+1

Eine wartungsfreundlichere Lösung könnte darin bestehen, eine Enumeration zu erstellen, in der die Größen und ihr "Wert" gespeichert werden - eine Zahl, die ohne einen benutzerdefinierten Vergleicher sortiert werden kann. – MTCoster

Antwort

6

Speichern Sie die Größen in der richtigen Reihenfolge in einer Liste oder Karte (für eine mögliche Leistungssteigerung). Dann können Sie Ihren eigenen Vergleicher erstellen, der die Position der gesuchten Größe in dieser Liste/Karte überprüft und sie mit der Position eines anderen Elements vergleicht. Alles, was Sie tun müssen, ist diese Positionen zu vergleichen.

Etwas wie:

private static Comparator<String> sizeComparator = new Comparator<String>() { 

    private Map<String,Integer> sizes = new HashMap<>(); 
    { 
     int i=0; 
     for (String size : new String[]{"XS", "S", "M", "L", "XL", "XXL"}){ 
      sizes.put(size,i++); 
     } 
    } 

    @Override 
    public int compare(String o1, String o2) { 
     return Integer.compare(sizes.get(o1),sizes.get(o2)); 
    } 

}; 

Verbrauch:

List<String> list = Arrays.asList("L", "M", "XL", "XS", "S", "XXL"); 
System.out.println(list); 
list.sort(sizeComparator); 
System.out.println(list); 

Ausgang:

[L, M, XL, XS, S, XXL] //before sorting 
[XS, S, M, L, XL, XXL] //after sorting 
+0

Tolle Lösung! Tausend Dank. –

Verwandte Themen