web-dev-qa-db-fra.com

Java pour la chaîne ne fonctionne pas correctement pour les caractères sensibles à la casse et spéciaux

Je travaillais sur le tri d'une liste de chaînes dans Java (1.8) et j'ai appris que cela ne fonctionnait pas comme prévu!

J'essaie le code suivant pour le tri:

private Set<String> getTestData() {
    Set<String> compRoles = new HashSet<>();
    compRoles.add("AA");
    compRoles.add("Aa");
    compRoles.add("aA");
    compRoles.add("aa");
    compRoles.add("11");
    compRoles.add("117");
    compRoles.add("12");
    compRoles.add("21");
    compRoles.add("!@");
    compRoles.add("@!");
    compRoles.add("@@!");
    compRoles.add("BB");
    compRoles.add("Bb");
    compRoles.add("bb");
    return compRoles;
}

public static void main(String args[]) {
    List<String> test = new ArrayList<>(new Test().getTestData());
    System.out.println(test);
    Collections.sort(test);
    System.out.println(test);
}

Avant le tri:[AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]

Après tri:[!@, 11, 117, 12, 21, @!, @@!, AA, Aa, BB, Bb, aA, aa, bb]

Mon attente est:[!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]

Dois-je utiliser autre chose que le tri naturel pour cela?

22
Prabal Srivastava

Vous pouvez utiliser la classe Collator de Java.

public static void main(String[] args) {
    List<String> test = new ArrayList<>(new Test().getTestData());
    System.out.println(test);
    test.sort(Collator.getInstance(Locale.ENGLISH));
    System.out.println(test);
}

Production:-

[AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]
[!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]
31
Jaspreet Jolly

Vous pouvez créer un comparateur personnalisé pour vos logiques de tri. Après cela, vous pouvez l'utiliser comme ceci:

Collections.sort(yourArrayList, new YourComparator());
3
ipave