Maison > Java > javaDidacticiel > Exemple de cordes alphanumériques de tri java

Exemple de cordes alphanumériques de tri java

James Robert Taylor
Libérer: 2025-03-07 17:28:25
original
1031 Les gens l'ont consulté

Java Tri des chaînes alphanumériques Exemple

Cet exemple démontre le tri d'une liste de chaînes alphanumériques en Java à l'aide d'un comparateur personnalisé. Nous utiliserons une List de chaînes et la méthode Collections.sort(), qui nous permet de spécifier une logique de tri personnalisée.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class AlphanumericSort {

    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        strings.add("apple1");
        strings.add("apple10");
        strings.add("apple2");
        strings.add("banana1");
        strings.add("banana20");
        strings.add("banana10");
        strings.add("apple");


        // Sort using a custom comparator
        Collections.sort(strings, new AlphanumericComparator());

        System.out.println("Sorted strings:");
        for (String str : strings) {
            System.out.println(str);
        }
    }

    static class AlphanumericComparator implements Comparator<String> {
        @Override
        public int compare(String s1, String s2) {
            int i = 0;
            while (i < s1.length() && i < s2.length()) {
                char c1 = s1.charAt(i);
                char c2 = s2.charAt(i);

                if (Character.isDigit(c1) && Character.isDigit(c2)) {
                    int num1 = 0;
                    int num2 = 0;
                    while (i < s1.length() && Character.isDigit(s1.charAt(i))) {
                        num1 = num1 * 10 + (s1.charAt(i) - '0');
                        i++;
                    }
                    while (i < s2.length() && Character.isDigit(s2.charAt(i))) {
                        num2 = num2 * 10 + (s2.charAt(i) - '0');
                        i++;
                    }
                    return Integer.compare(num1, num2);
                } else if (Character.isDigit(c1)) {
                    return 1; // Digits come after letters
                } else if (Character.isDigit(c2)) {
                    return -1; // Digits come after letters
                } else if (c1 != c2) {
                    return c1 - c2; // Compare characters
                } else {
                    i++;
                }
            }
            return s1.length() - s2.length(); // Compare lengths if prefixes are equal

        }
    }
}
Copier après la connexion

Comment puis-je trier efficacement une liste des chaînes alphanumériques en Java?

Tri efficacement des chaînes alphanumériques en Java? La méthode intégrée Collections.sort() utilise un tri de fusion hautement optimisé, qui fournit une complexité temporelle O (n log n) dans les cas moyens et pires. Cependant, l'efficacité dépend fortement de la Comparator que vous fournissez.

Une comparaison de chaînes naïve ne triera pas correctement les chaînes alphanumériques car elle traite les nombres lexicographiquement ("10" avant "2"). Par conséquent, vous devez implémenter une coutume Comparator qui gère correctement la nature alphanumérique des chaînes. L'exemple ci-dessus démontre un tel comparateur. Ce comparateur analyse les cordes, séparant les parties alphabétiques et numériques, et les compare en conséquence. Cette approche évite les conversions de chaînes inutiles ou les bibliothèques externes, conduisant à un tri efficace.

Quelles sont les pièges courants à éviter lors du tri des chaînes alphanumériques en Java?

Plusieurs pièges courants peuvent conduire à un tri incorrect ou inefficace des chaînes alphanumériques:

>
  • Ordonnance lexicographique: La comparaison standard des chaînes traite les nombres lexicographiques. Cela signifie que "10" est considéré comme inférieur à "2", ce qui est incorrect pour le tri alphanumérique. Utilisez toujours un Comparator personnalisé pour gérer les portions numériques en tant que nombres, pas des chaînes.
  • Manipulation incorrecte des pièces alphabétiques et numériques mixtes: a Comparator doit gérer correctement les chaînes avec des combinaisons variées de pièces alphabétiques et numériques. Il doit d'abord comparer les parties alphabétiques, puis les parties numériques, garantissant une commande correcte.
  • Ignorer les zéros principaux: Les pièces numériques doivent être traitées comme des entiers, pas des chaînes. Les zéros principaux ne doivent pas affecter l'ordre de tri.
  • Logique de comparaison inefficace: Un Comparator mal conçu peut conduire à un tri inefficace. Évitez les manipulations ou conversions de chaînes inutiles dans la logique de comparaison. L'exemple ci-dessus montre une approche efficace qui minimise les frais généraux.
  • Cordons nuls ou vides: Votre Comparator doit gérer gracieusement null ou des chaînes vides pour empêcher NullPointerExceptions. Envisagez d'ajouter des vérifications des valeurs null et de les manipuler de manière appropriée.

y a-t-il des fonctions Java ou des bibliothèques intégrées qui simplifient le tri des chaînes alphanumériques?

Bien que Java n'ait pas de fonction intégrée spécifiquement conçue pour le tri de chaîne alphanumérique, la méthode Collections.sort(), avec une solution de coutume Comparator, une flexible. Des bibliothèques comme Apache Commons Lang offrent des utilitaires qui pourraient aider à la manipulation des cordes (par exemple, extraire des pièces numériques), mais elles ne fournissent pas directement un trieur alphanumérique prêt à l'emploi. La création d'une personnalité Comparator est généralement l'approche la plus efficace et la plus directe pour cette tâche, car elle vous permet de contrôler avec précision la logique de tri pour répondre à vos besoins spécifiques. L'utilisation de bibliothèques externes peut ajouter des frais généraux et des dépendances inutiles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal