[Java] Conseils de tri lorsque les chaînes et les nombres sont mélangés

Poursuivant la précédente [Java 8] Utilisation appropriée de Compareable et Comparator du point de vue du tri des employés, voici des conseils pour le tri.

Je n'ai pas pu trouver grand-chose quand je l'ai cherché,

["2", "32", "100", "13", "1", "21"]

Un tel arrangement

["A02", "12", "A11", "A01", "B01", "A21"]

Je veux trier ce genre de tableau ** "Yoshina" **! As-tu déjà pensé?

Il est difficile d'analyser chaque nombre, et une fois analysé, il est difficile de contrôler quand ce n'est pas un nombre. Ce n'est pas un gros problème, mais je pensais que cela pourrait être résolu avec un processus relativement simple, alors je vais écrire le processus.

Résultat de tri attendu


["1", "2", "13", "21", "32", "100"]
// ->Avant de trier["2", "32", "100", "13", "1", "21"]

["12", "A01", "A02", "A11", "A21", "B01"]
// ->Avant de trier["A02", "12", "A11", "A01", "B01", "A21"]

La ligne du bas est ** comparez d'abord les longueurs des chaînes, puis comparez les chaînes **.

Je vais effectivement l'écrire.

Comparez les longueurs des chaînes, puis comparez les chaînes


pubic List<String> sort(List<String> list) {
    list.sort((s1, s2) -> {
        if (compareLength(s1, s2) == 0) {
            return s1.compareTo(s2);
        }
        return compareLength(s1, s2);
    });
    return list;
}

private int compareLength(String s1, String s2) {
    if (s1.length() > s2.length()) {
        return 1;
    } else if (s1.length() < s2.length()) {
        return -1;
    } else {
        return 0;
    }
}

Résultat d'exécution


List<String> list1 = new ArrayList<>(Arrays.asList("2", "32", "100", "13", "1", "21"));↲
List<String> list2 = new ArrayList<>(Arrays.asList("A02", "12", "A11", "A01", "B01", "A21"));↲
List<String> list3 = new ArrayList<>(Arrays.asList("0002", "0032", "0100", "0013", "0001", "0021"));↲

System.out.println(ArrayUtils.toString(sort(list1)));
System.out.println(ArrayUtils.toString(sort(list2)));

//Résultat d'exécution
[1, 2, 13, 21, 32, 100]
[12, A01, A02, A11, A21, B01]

À propos, même si les chiffres sont complétés avec 0, si le nombre de chiffres est le même, il sera trié comme prévu.

En cas de remplissage 0


List<String> list = new ArrayList<>(Arrays.asList("0002", "0032", "0100", "0013", "0001", "0021"));↲

System.out.println(ArrayUtils.toString(sort(list)));

//Résultat d'exécution
[0001, 0002, 0013, 0021, 0032, 0100]

Je ne pense pas qu'il puisse être utilisé dans n'importe quelle situation car il dit ** "Yoshinani" **, mais personnellement je suis satisfait des résultats attendus. Si vous avez une logique qui peut être traitée plus intelligemment, ou une liste qui ne peut pas être traitée "bien" avec cette méthode, je vous serais reconnaissant de bien vouloir la partager!

Postscript

Il a fait remarquer que ce serait plus simple si vous faisiez ce qui suit!

List<String> list = Arrays.asList("2", "32", "100", "13", "1", "21");
list.sort(Comparator.comparing(String::length).thenComparing(Function.identity());
System.out.println(list);

Recommended Posts

[Java] Conseils de tri lorsque les chaînes et les nombres sont mélangés
[Java] Que sont les remplacements et les surcharges?
[Java] Conseils et problèmes d'erreur lors de la conversion du double en grand décimal
Convertir des objets Java org.w3c.dom.Document et des chaînes XML
Comportement lorsque les noms d'annotation Java sont portés
java jshell et var sont trop recommandés!
[Java] Précautions lors de la comparaison de chaînes de caractères avec des chaînes de caractères
Astuces Java, astuces
Astuces Java
Instruction de commutation Java et pause, Kotlin lorsque l'expression ...
Astuces Java: suspectez les dépendances lorsque ClassNotFoundException se produit dans JavaMail
Lorsqu'il y a des variables d'environnement dans les tests Java
Distinguer les nombres positifs et négatifs en Java