Sortieren der Arrayliste in alphabetischer Reihenfolge (Groß- und Kleinschreibung wird nicht berücksichtigt)

121

Ich habe eine String-Arrayliste, namesdie Namen von Personen enthält. Ich möchte die Arrayliste in alphabetischer Reihenfolge sortieren.

ArrayList<String> names = new ArrayList<String>();
names.add("seetha");
names.add("sudhin");
names.add("Swetha");
names.add("Neethu");
names.add("ananya");
names.add("Athira");
names.add("bala");
names.add("Tony");
names.add("Karthika");
names.add("Nithin");
names.add("Vinod");
names.add("jeena");
Collections.sort(names);
for(int i=0; i<names.size(); i++)
    System.out.println(names.get(i));

Ich habe versucht, die Liste oben zu sortieren. Das sortierte Array wird jedoch wie folgt angezeigt:

Athira
Karthika
..
..
ananya
bala
...

aber ich möchte es nicht zwischen Groß- und Kleinschreibung unterscheiden. Ich möchte das Ergebnis wie folgt:

ananya
Athira
bala
Andro-Mädchen
quelle

Antworten:

330

Benutzerdefiniert Comparatorsollte helfen

Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
});

Oder wenn Sie Java 8 verwenden:

list.sort(String::compareToIgnoreCase);
denis.solonenko
quelle
1
Kannst du mir sagen, was die Zeichenfolge s1 und s2 ist und wie das Ergebnis angezeigt wird, wenn die Vergleichsfunktion einen ganzzahligen Wert zurückgibt?
Andro-Mädchen
@seethalakshmi das sind die Zeichenfolgen von Ihrer Liste. Bitte werfen Sie einen Blick auf die Quellen der Collections.sort-Methode, wenn Sie weitere Informationen dazu erhalten möchten
denis.solonenko
Ich möchte die sortierte Liste in logcat anzeigen. Wie kann ich das tun?
Andro-Mädchen
Es wird als Objekt angezeigt, es sei denn, Sie teilen die Liste nach dem Sortieren mit einer Schleife auf. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
Verlassener Wagen
2
@Dante Wenn Sie sich die Implementierung von ansehen String.CASE_INSENSITIVE_ORDER, werden Sie sehen, dass A1 lessals A10 verurteilt ist, nur weil die Länge kleiner ist. Es gibt keine sofort
einsatzbereite
195

Am einfachsten ist es:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
Djunod
quelle
@djunod, danke für die Antwort. Ich habe auch Ihre Lösung für die ArrayList von A1 bis A10 ausprobiert, aber die A10 hat nicht richtig sortiert, genau wie die Lösung von denis.solenenko. Irgendwie geht der A10 nach A1. Grundsätzlich sortierte es nach A1, A10, A2, A3 usw. Warum ist es passiert und wie kann ich die Liste richtig sortieren?
Dante
2
@dante, das ist normale Stringsortierung. Wenn Sie möchten, dass A2 vor A10 kommt, müssen Sie es in A02 usw.
ändern
1
Plus 1. Funktionierte auch in Android. Danke und Glückwunsch.
statosdotcom
@djunod Vielen Dank :)
Kumar
Der Stackoverflow sollte mir die Möglichkeit bieten, Antworten / Snippets wie diese zu speichern.
HB.
29

Versuchen Sie diesen Code

Collections.sort(yourarraylist, new SortBasedOnName());



import java.util.Comparator;
import com.RealHelp.objects.FBFriends_Obj;
import com.RealHelp.ui.importFBContacts;

public class SortBasedOnName implements Comparator
{
public int compare(Object o1, Object o2) 
{

    FBFriends_Obj dd1 = (FBFriends_Obj)o1;// where FBFriends_Obj is your object class
    FBFriends_Obj dd2 = (FBFriends_Obj)o2;
    return dd1.uname.compareToIgnoreCase(dd2.uname);//where uname is field name
}

}
Hacker
quelle
3
Gute Antwort! Ich denke, wenn Sie 'implementiert Komparator' in 'implementiert Komparator <FBFriends_Obj> ändern und die Objekttypen im Vergleich zu FBFriends_Obj ändern, brauchen Sie nicht dd1 und dd2, sondern können o1 und o2 direkt in der return-Anweisung verwenden
FrinkTheBrave
11

Basierend auf den oben genannten Antworten konnte ich meine benutzerdefinierten Klassenobjekte wie folgt vergleichen:

ArrayList<Item> itemList = new ArrayList<>();
...
Collections.sort(itemList, new Comparator<Item>() {
            @Override
            public int compare(Item item, Item t1) {
                String s1 = item.getTitle();
                String s2 = t1.getTitle();
                return s1.compareToIgnoreCase(s2);
            }

        });
Usman
quelle
4

Sie müssen einen benutzerdefinierten Komparator verwenden, der verwendet wird compareToIgnoreCase, nicht compareTo.

Vladimir Ivanov
quelle
Ich habe versucht, diesen Link. Aber ich bin nicht in der Lage, d Lösung zu finden. Kannst du erklären
Andro-Girl
3

Ab Java 8 können Sie Folgendes verwenden Stream:

List<String> sorted = Arrays.asList(
                          names.stream().sorted(
                              (s1, s2) -> s1.compareToIgnoreCase(s2)
                          ).toArray(String[]::new)
                      );

Daraus wird ein Stream abgerufen ArrayList, der dann sortiert wird (wobei der Fall ignoriert wird). Danach wird der Stream in ein Array konvertiert, das in ein konvertiert wird ArrayList.

Wenn Sie das Ergebnis drucken mit:

System.out.println(sorted);

Sie erhalten folgende Ausgabe:

[ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod]
ROMANIA_engineer
quelle
3

Leider berücksichtigen alle bisherigen Antworten nicht, dass "a"dies "A"beim Sortieren nicht als gleich angesehen werden darf .

String[] array = {"b", "A", "C", "B", "a"};

// Approach 1
Arrays.sort(array);
// array is [A, B, C, a, b]

// Approach 2
Arrays.sort(array, String.CASE_INSENSITIVE_ORDER);
// array is [A, a, b, B, C]

// Approach 3
Arrays.sort(array, java.text.Collator.getInstance());
// array is [a, A, b, B, C]

In Ansatz 1 werden Kleinbuchstaben als größer angesehen als Großbuchstaben.

Ansatz 2 macht es noch schlimmer, da CASE_INSENSITIVE_ORDER berücksichtigt "a"und "A"gleich ist (Vergleichsergebnis ist0 ). Dies macht das Sortieren nicht deterministisch.

Ansatz 3 (unter Verwendung eines java.text.Collator) ist meiner Meinung nach die einzige Möglichkeit, dies korrekt zu tun, da er berücksichtigt "a"und "A"nicht gleich ist, sondern sie in die richtige Reihenfolge entsprechend dem aktuellen (oder einem anderen gewünschten) Gebietsschema bringt.

Lars Gendner
quelle