Sortowanie arraylisty w porządku alfabetycznym (bez rozróżniania wielkości liter)

121

Mam arraylistę ciągów znaków, namesktóra zawiera nazwiska osób. Chcę posortować listę arraylistyczną w kolejności alfabetycznej.

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

Próbowałem uporządkować listę w powyższy sposób. Ale wyświetla posortowaną tablicę jako:

Athira
Karthika
..
..
ananya
bala
...

ale nie chcę rozróżniać wielkości liter. Chcę, aby wynik był taki jak:

ananya
Athira
bala
andro-girl
źródło

Odpowiedzi:

330

Zwyczaj Comparatorpowinien pomóc

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

Lub jeśli używasz Java 8:

list.sort(String::compareToIgnoreCase);
denis.solonenko
źródło
1
Czy możesz mi powiedzieć, co to jest ciąg s1 i s2? i jak można zobaczyć wynik, jeśli funkcja porównania zwraca wartość całkowitą.
andro-girl
@seethalakshmi to ciągi z Twojej listy. Proszę spojrzeć na źródła metody Collections.sort, jeśli chcesz uzyskać więcej informacji na ten temat
denis.solonenko
chcę wyświetlić posortowaną listę w logcat.jak mogę to zrobić?
andro-girl
Pojawi się jako obiekt, chyba że po posortowaniu podzielisz listę za pomocą pętli. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
Opuszczony wózek
2
@Dante Jeśli spojrzysz na implementację hthe String.CASE_INSENSITIVE_ORDER, zobaczysz, że A1 jest warunkowane lessniż A10 tylko dlatego, że długość jest mniejsza. Nie ma wsparcia dla "naturalnego sortowania" po wyjęciu z pudełka, możesz
rzucić
195

Najprościej jest:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
djunod
źródło
@djunod, dzięki za odpowiedź. Wypróbowałem również Twoje rozwiązanie dla ArrayList od A1 do A10, ale A10 nie sortował poprawnie, tak jak rozwiązanie denis.solenenko. Jakoś A10 jedzie po A1. Zasadniczo posortowano je jako A1, A10, A2, A3 itd. Dlaczego to się stało i jak mogę poprawnie posortować listę?
Dante
2
@dante, czyli normalne sortowanie ciągów. Jeśli chcesz, aby A2
podjechał
1
Plus 1. Pracował również w systemie Android. Dzięki i gratulacje.
statosdotcom
@djunod Dziękuję bardzo :)
Kumar
stackoverflow powinien zapewnić mi opcję zapisywania odpowiedzi / fragmentów w ten sposób ..
HB.
29

wypróbuj ten kod

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
}

}
haker
źródło
3
Świetna odpowiedź! Myślę, że jeśli zmienisz 'implements Comparator' na 'implements Comparator <FBFriends_Obj> i zmienisz typy obiektów w porównaniu do FBFriends_Obj, nie potrzebujesz dd1 i dd2, możesz użyć o1 i o2 bezpośrednio w instrukcji powrotu
FrinkTheBrave
11

W oparciu o powyższe odpowiedzi udało mi się porównać moje niestandardowe obiekty klas w następujący sposób:

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
źródło
4

Musisz użyć niestandardowego komparatora, który użyje compareToIgnoreCase, a nie porównania.

Vladimir Ivanov
źródło
Wypróbowałem ten link. ale nie jestem w stanie znaleźć rozwiązania d. mogę u plz wyjaśnić
andro-girl
3

Począwszy od Java 8 możesz użyć Stream:

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

Pobiera z tego strumień ArrayList, a następnie sortuje go (ignorując wielkość liter). Następnie strumień jest konwertowany na tablicę, która jest konwertowana na plik ArrayList.

Jeśli drukujesz wynik za pomocą:

System.out.println(sorted);

otrzymasz następujący wynik:

[ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod]
ROMANIA_engineer
źródło
3

Niestety, wszystkie dotychczasowe odpowiedzi nie uwzględniają tego, że "a"nie można ich traktować jako równych, "A"jeśli chodzi o sortowanie.

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]

W podejściu 1 wszelkie małe litery są uważane za większe niż jakiekolwiek duże litery.

Podejście 2 pogarsza sytuację, ponieważ CASE_INSENSITIVE_ORDER uwzględnia "a"i jest "A"równe (wynik porównania to 0). To sprawia, że ​​sortowanie jest niedeterministyczne.

Podejście 3 (przy użyciu java.text.Collator) jest jedynym sposobem wykonania tego poprawnie przez IMHO, ponieważ bierze pod uwagę "a"i "A"nie jest równe, ale umieszcza je we właściwej kolejności zgodnie z bieżącym (lub innym pożądanym) ustawieniem regionalnym.

Lars Gendner
źródło