2016-04-08 5 views
2

Wie kann ich eine benutzerdefinierte erreichen, um den Inhalt des Feldes Name Sortierung:Sortieren Arraylist von Objekten durch Feld in kundenspezifischen Auftrag

  • erste Element: P gefolgt von Zahlen [1-9] {2} immer zuerst
  • gefolgt von: P gefolgt von Ziffern 0 [0-9]
  • gefolgt von: S
  • gefolgt von Ziffern [1-9] {2}
  • und dann dem Rest in normaler Reihenfolge i1.getName().compareToIgnoreCase(i2.getName())

    private static Comparator<Item> itemComperator = new Comparator<Item>() { 
        @Override 
        public int compare(Item i1, Item i2) { 
         if (i1.getName().matches("P[1-9]{2}") && i2.getName().matches("P0[0-9]")) 
          return -1; 
         else if (i1.getName().matches("S[1-9]{2}")) 
          return -1; 
         else 
          return i1.getName().compareToIgnoreCase(i2.getName()); 
        } 
    }; 
    
    @Test 
    public void sortItem() { 
        Item item01 = new Item(1, "R59"); 
        Item item02 = new Item(2, "S48"); 
        Item item03 = new Item(3, "P01"); 
        Item item04 = new Item(4, "P25"); 
        Item item05 = new Item(5, "R99"); 
    
        List<Item> items = Arrays.asList(item01, item02, item03, item04, item05); 
        System.out.println("before sorting"); 
        long seed = System.nanoTime(); 
        Collections.shuffle(items, new Random(seed)); 
        for (Item i : items) { 
         System.out.println(i.getId() + " " + i.getName()); 
        } 
    
        System.out.println("after sorting"); 
        Collections.sort(items, itemComperator); 
        for (Item i : items) { 
         System.out.println(i.getId() + " " + i.getName()); 
        } 
    
    
    } 
    
    public class Item { 
        private int id; 
        private String name; 
    
        public Item(int id, String name) { 
         this.id = id; 
         this.name = name; 
        } 
    
        public int getId() { 
         return id; 
        } 
    
        public void setId(int id) { 
         this.id = id; 
        } 
    
        public String getName() { 
         return name; 
        } 
    
        public void setName(String name) { 
         this.name = name; 
        } 
    } 
    

Ausgang erwartet:

after sorting 
4 P25 
3 P01 
2 S48 
1 R59 
5 R99 
+0

Können Sie umfassen die geforderte Ausgabe mit der Frage .. ??? –

Antwort

5

Ich denke, dass ich zum ersten Mal jeden der Eingänge zu einer „Art“ Zahl Karte würde, die oben auf der Liste der Kriterien basieren. Zum Beispiel:

int kind(String input) { 
    if (input.matches("P[1-9]{2}") { 
    return 0; 
    } else if (input.matches("P0[0-9]")) { 
    return 1; 
    } else if (input.matches("S.*")) { 
    return 2; 
    } else if (input.matches("[1-9]{2}")) { 
    return 3; 
    } else { 
    return 4; 
    } 
} 

Dies gibt Ihnen einen Weg, um zu sehen, ob die beiden Saiten der gleichen „Art“ sind; Wenn nicht, geben Sie die Reihenfolge basierend auf der Art zurück. Wenn sie die gleiche Art sind, zu vergleichen, nur um sie mit (Groß- und Kleinschreibung) lexikographische Ordnung (Sie müssen nicht angeben, aber ich nehme an, Sie wollen zB „P11“ kommen vor „P22“):

public int compare(Item a, Item b) { 
    String nameA = a.getName(); 
    String nameB = b.getName(); 

    int kindA = kind(nameA); 
    int kindB = kind(nameB); 
    if (kindA != kindB) { 
    return Integer.compare(kindA, kindB); 
    } else { 
    return nameA.compareToIgnoreCase(nameB); 
    } 
} 
+2

Vielleicht 'input.matches (" S. * ")' Anstelle von 'input.matches (" S * ")'? – radoh

+0

@radoho guten Fang, Tippfehler. Fest, danke. –

+0

von Tag gerettet, tolle Arbeit – Alex