Classificação da matriz em ordem alfabética (sem distinção entre maiúsculas e minúsculas)

121

Eu tenho uma string arraylist namesque contém nomes de pessoas. Eu quero classificar a lista de matrizes em ordem alfabética.

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

Eu tentei classificar a lista da maneira acima. Mas está exibindo a matriz classificada como:

Athira
Karthika
..
..
ananya
bala
...

mas não quero torná-lo sensível a maiúsculas. Eu quero o resultado como:

ananya
Athira
bala
andro-girl
fonte

Respostas:

330

O costume Comparatordeve ajudar

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

Ou se você estiver usando o Java 8:

list.sort(String::compareToIgnoreCase);
denis.solonenko
fonte
1
você pode me dizer o que é string s1 e s2? e como pode ver o resultado se a função de comparação retornar valor inteiro.
precisa saber é o seguinte
@seethalakshmi são as strings da sua lista. Por favor, dê uma olhada nas fontes de método Collections.sort se você quiser obter mais detalhes sobre isso
denis.solonenko
Eu quero exibir a lista classificada em logcat.how posso fazer isso?
precisa saber é o seguinte
Ele aparecerá como um Objeto, a menos que você divida a lista com um loop após a classificação. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
Carrinho abandonado
2
@ Dante, se você der uma olhada na implementação de String.CASE_INSENSITIVE_ORDER, verá que A1 é compatível com lessA10 apenas porque o comprimento é menor. Não existe um "tipo natural" apoiar fora da caixa, você pode querer dar uma olhada em stackoverflow.com/questions/1262239/...
denis.solonenko
195

A coisa mais simples a fazer é:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
djunod
fonte
@ Djunod, obrigado pela resposta. Tentei também a sua solução para o ArrayList de A1 a A10, mas o A10 não se classificou corretamente como a solução de denis.solenenko. De alguma forma, o A10 segue a A1. Basicamente, classificou como A1, A10, A2, A3 etc. Por que isso aconteceu e como posso classificar a lista corretamente?
Dante5
2
@ dante, isso é uma classificação normal de strings. Se você quiser A2 vir antes A10, você vai ter que mudá-lo para A02, etc.
djunod
1
Plus 1. Trabalhou no Android também. Obrigado e parabéns.
Statosdotcom 16/05/19
@djunod Thank u very much :)
Kumar
O stackoverflow deve me fornecer uma opção para salvar respostas / trechos como este ..
HB.
29

tente este código

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
fonte
3
Ótima resposta! Eu acho que se você alterar 'implementa o comparador' para 'implementa o comparador <FBFriends_Obj> e altera os tipos de objeto na comparação com FBFriends_Obj, então você não precisa de dd1 e dd2, pode usar o1 e o2 diretamente na declaração de retorno
FrinkTheBrave
11

Com base nas respostas acima mencionadas, consegui comparar meus Objetos de Classe personalizados como este:

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
fonte
4

Você precisa usar o comparador personalizado que usará compareToIgnoreCase, não compareTo.

Vladimir Ivanov
fonte
Eu tentei isso link.but im não capaz de encontrar d solution.can u plz explicar
andro-girl
3

A partir do Java 8, você pode usar Stream:

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

Ele obtém um fluxo a partir disso ArrayListe o classifica (ignorando o caso). Depois disso, o fluxo é convertido em uma matriz que é convertida em um ArrayList.

Se você imprimir o resultado usando:

System.out.println(sorted);

você obtém a seguinte saída:

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

Infelizmente, todas as respostas até o momento não levam em consideração que "a"não devam ser consideradas iguais "A"quando se trata de classificação.

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]

Na abordagem 1, qualquer letra minúscula é considerada maior que qualquer letra maiúscula.

Abordagem 2 torna pior, já que CASE_INSENSITIVE_ORDER considera "a"e "A"igual (resultado comparation é 0). Isso torna a classificação não determinística.

A abordagem 3 (usando um java.text.Collator) é IMHO a única maneira de fazê-lo corretamente, uma vez que considera "a"e "A"não é igual, mas os coloca na ordem correta de acordo com o local (atual ou qualquer outro desejado).

Lars Gendner
fonte