Ordinamento della lista di array in ordine alfabetico (senza distinzione tra maiuscole e minuscole)


121

Ho un elenco di stringhe namesche contiene nomi di persone. Desidero ordinare l'elenco degli array in ordine alfabetico.

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

Ho provato a ordinare l'elenco nel modo sopra. Ma mostra l'array ordinato come:

Athira
Karthika
..
..
ananya
bala
...

ma non voglio che faccia distinzione tra maiuscole e minuscole. Voglio il risultato come:

ananya
Athira
bala

Risposte:


330

L'abitudine Comparatordovrebbe aiutare

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

O se stai usando Java 8:

list.sort(String::compareToIgnoreCase);

1
puoi dirmi cos'è la stringa s1 e s2? e come puoi vedere il risultato se la funzione di confronto restituisce un valore intero.
andro-girl

@seethalakshmi che sono le stringhe dalla tua lista. Si prega di dare un'occhiata alle fonti del metodo Collections.sort se si desidera ottenere maggiori dettagli su questo
denis.solonenko

voglio visualizzare l'elenco ordinato in logcat. come posso farlo?
andro-girl

Apparirà come un oggetto, a meno che non si scomponga l'elenco con un ciclo dopo l'ordinamento. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
Carrello abbandonato

2
@ Dante se dai un'occhiata all'implementazione di String.CASE_INSENSITIVE_ORDER, vedrai che A1 è condonato lessdi A10 solo perché la lunghezza è più piccola. Non c'è un "tipo naturale" sostenere fuori dalla scatola, si potrebbe desiderare di dare un'occhiata a stackoverflow.com/questions/1262239/...
denis.solonenko

195

La cosa più semplice da fare è:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

@djunod, grazie per la risposta. Ho provato anche la tua soluzione per ArrayList da A1 ad A10, ma A10 non è stato ordinato correttamente proprio come la soluzione di denis.solenenko. In qualche modo, l'A10 va dopo l'A1. Fondamentalmente, è ordinato come A1, A10, A2, A3, ecc. Perché è successo e come posso ordinare correttamente l'elenco?
Dante

2
@ Dante, questo è il normale ordinamento delle stringhe. Se vuoi che A2 venga prima di A10, dovrai cambiarlo in A02, ecc.
djunod

1
Plus 1. Funzionava anche su Android. Grazie e complimenti.
statosdotcom

@djunod Grazie mille :)
Kumar

stackoverflow dovrebbe fornirmi un'opzione per salvare risposte / frammenti come questo ..
HB.

29

prova questo codice

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
}

}

3
Bella risposta! Penso che se cambi 'implements Comparator' in 'implements Comparator <FBFriends_Obj> e cambi i tipi di oggetto nel confronto con FBFriends_Obj, allora non hai bisogno di dd1 e dd2 puoi usare o1 e o2 direttamente nella dichiarazione di ritorno
FrinkTheBrave

11

Sulla base delle risposte sopra menzionate, sono riuscito a confrontare i miei oggetti di classe personalizzati in questo modo:

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

        });


3

A partire da Java 8 puoi utilizzare Stream:

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

Ottiene un flusso da quello ArrayList, quindi lo ordina (ignorando il caso). Successivamente, il flusso viene convertito in un array che viene convertito in un file ArrayList.

Se stampi il risultato usando:

System.out.println(sorted);

si ottiene il seguente output:

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

3

Purtroppo tutte le risposte fino ad ora non tengono conto di ciò che "a"non deve essere considerato uguale a "A"quando si parla di smistamento.

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]

Nell'approccio 1 qualsiasi lettera minuscola è considerata maggiore di qualsiasi lettera maiuscola.

L'approccio 2 peggiora le cose, poiché CASE_INSENSITIVE_ORDER considera "a"ed è "A"uguale (il risultato del confronto è 0). Ciò rende l'ordinamento non deterministico.

L'approccio 3 (utilizzando un java.text.Collator) è IMHO l'unico modo per farlo correttamente, poiché considera "a"e "A"non è uguale, ma li mette nell'ordine corretto in base alla Locale corrente (o qualsiasi altra desiderata).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.