J'essaie de trier un tableau de liste qui contient des cordes contenant des entiers et des lettres, mais lorsque je le fais la manière régulière, je reçois une sortie bizarre:
Code pertinent: Je m'attends: P> "98 food"
"9 hello"
"3 pencil"
"2514 human"
"105 cat"
4 Réponses :
Qu'est-ce que vous avez, c'est exactement l'ordre lexicographique car pas les chiffres sont comparés mais leurs chiffres alphabétiquement. Si vous souhaitez un autre comportement, vous devriez envisager d'implémenter votre propre comparateur code> code> dans lequel vous analyserez les chiffres. p>
En tant que note, le terme est lexicographique b>. En outre, la réponse ressemble davantage à un commentaire qu'une réponse complète. Une réponse complète fournirait probablement une solution prête, voir Comment répondre .
Ok, merci pour votre conseil
Vous vous rendez compte que votre réponse n'a aucun sens quand il y a un "P" entre 2 "H". Maintenant, cela a dit que c'était plus comme si le tri ne prend que le premier chiffre et regroupant tous les TheBstarts avec 1 puis tout ce qui commence avec 2 et ainsi de suite
Utiliser le compositeur pour résoudre votre problème comme celui-ci
Ajoutez ce code à l'intérieur de votre classe p> Ajouter ce code dans votre fonction d'appel P> [2514 human, 105 cat, 98 food, 9 hello, 3 pencil]
Que diriez-vous de ce code BLH-MAXX?
Est-ce que cela fonctionne sur une entrée de 100K?
Si les données sont de même que votre code posté, cela fonctionnera.
c'est un redis db avec plus ou moins de rangées de 100k avec un nombre et un mot
Oui ça va marcher
Vous pouvez utiliser ce code comme util pour appeler à nouveau pour trier avec votre propre commande personnalisée.
Je pense que vous devriez créer une classe pour représenter les éléments de la liste.
Par exemple: Votre code deviendrait alors: p> avec le résultat suivant: p>
Cela fonctionnera-t-il toujours si j'ai dit environ 100k entrées?
@ Blh-maxx oui ??
Vous devez avoir un comparateur personnalisé pour satisfaire vos besoins. Solution Java 8:
List<String> words = new ArrayList<>(); words.add("9 hello"); words.add("98 food"); words.add("105 cat"); words.add("2514 human"); words.add("3 pencil"); // Sort the existing list words.sort(Comparator.comparing(s -> Integer.parseInt(s.split(" ")[0]), Comparator.reverseOrder())); // To create new sorted list List<String> sortedWords = words.stream() .sorted(Comparator.comparing(s -> Integer.parseInt(s.split(" ")[0]), Comparator.reverseOrder())) .collect(Collectors.toList());
Pourquoi espérez-vous exactement que ces résultats? Vous avez demandé un ordre alphabétique inversé qui semble exactement ce que vous obtenez
Pourquoi
2514 humain code> devrait être avant
105 chat code>?
Vous triez le texte lexicographique b>. Vous n'éprouvez pas les chiffres.
9 ... code> est supérieur à
2 ... code> peu importe ce qui vient après. Vous devez interpréter les chiffres en tant que numéros réels au lieu de texte pour trier cela dans la manière dont vous voulez.
Je suppose que vous aurez besoin d'un objet composite et faire une tresse inverse et non sur le mot, mais sur la valeur numérique.
vos valeurs ne sont pas un entier, il est comparé comme une chaîne
@ Blm-maxx Vous devez trier descendances en fonction du compte
Comme une note à vous tous qui ne lisez pas le contexte complet. Je fais de la relance d'une commande de 2 premiers chiffres et je n'ai rien à voir avec les alphabets comme vous le voyez dans l'exemple que j'ai 2 mots commençant par H et entre celui qui a un p
Utilisez
mappe code> au lieu de ArrayList, il sera plus facile d'obtenir ce que vous désirez. Puis trier sur les touches.