2016-04-19 9 views
1

Ich habe eine unsortierte List ... sagen wir mal, es ist ArrayList, die Strings enthält, die auftreten können mehrere mal. Wie kann ich zuerst das Auftreten einer bestimmten Saite bestimmen? Der Rest der Einträge kann in der angegebenen Reihenfolge bleiben.Sortieren benutzerdefinierte Zeichenfolge zuerst

z. bestimmte Zeichenfolge, die an der Spitze zu sein hat:

unsortiert 'JKL': { DEF, ABC, JKL, GHI, ABC, DEF, JKL, MNO, GHI, ABC, MNO, JKL }

sortiert: { JKL, JKL, JKL, DEF, ABC, GHI, ABC, DEF, MNO, GHI, ABC, MNO }

Irgendwelche Vorschläge? :)

Antwort

1

ein Comparator Verwenden Sie aber vorsichtig sein, um sicherzustellen, dass der Komparator konsistent ist.

public void test() { 
    List<String> strs = Arrays.asList(new String[]{"DEF", "ABC", "JKL", "GHI", "ABC", "DEF", "JKL", "MNO", "GHI", "ABC", "MNO", "JKL"}); 
    // All these are special and should appear at the front of the list. 
    Set<String> specials = new HashSet<>(Arrays.asList("ABC", "JKL")); 
    strs.sort((String o1, String o2) -> { 
     if (specials.contains(o1) == specials.contains(o2)) { 
      // Both special or both normal - just compare. 
      return o1.compareTo(o2); 
     } else if (specials.contains(o1)) { 
      // First is special! 
      return -1; 
     } else { 
      // Second is special. 
      return 1; 
     } 
    }); 
    System.out.println(strs); 
} 
+0

Hey, das scheint eine sehr coole Lösung zu sein :). Aber ich weiß immer noch nicht, wie man alle JKL's an den Anfang bringt. Die aktuelle Ausgabe mit Ihrer Lösung ist: [ABC, ABC, ABC, JKL, JKL, JKL, DEF, DEF, GHI, GHI, MNO, MNO] – Kody

+0

@Kody - Entfernen Sie einfach das "ABC" aus den "Specials". – OldCurmudgeon

+0

Das ist großartig! Vielen Dank! :) – Kody

1

Sie können jedes Element aus der Liste löschen (außer wenn das erste Element JKL ist, da dies unnötig wäre) und am Anfang der Liste ein neues Element hinzufügen. Lassen Sie uns sagen, dass Ihre Liste list genannt wird:

for(int i = 1; i < list.length(); i++) { //no need to check if the first element is "JKL" 
    if(list.get(i).equals("JKL")) { 
     list.remove(i); 
     list.add(0, "JKL"); 
    } 
} 

Stellen Sie sicher, es zu entfernen, bevor es in die Liste. Wenn Sie es anders machen, müssen Sie list.remove(i+1); tun.

Bearbeiten: Für eine allgemeinere Lösung, die andere Objekte als Strings enthält, die besser nicht gelöscht und neu erstellt werden, können Sie das Element in einer temporären Variablen speichern, bevor Sie es löschen Liste:

for(int i = 1; i < list.length(); i++) { 
    if(list.get(i).equals("JKL")) { 
     String temp = list.get(i); 
     list.remove(i); 
     list.add(0, temp); 
    } 
} 
Verwandte Themen