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 } } }
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.
Plusieurs pièges courants peuvent conduire à un tri incorrect ou inefficace des chaînes alphanumériques:
>Comparator
personnalisé pour gérer les portions numériques en tant que nombres, pas des chaînes. 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. 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. 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. 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!