Tri des chaînes alphanumériques de java
J'ai ce tableau stockant le suffixe de certaines Url, l'utilisateur est d'ajouter:
[U2, U3, U1, U5, U8, U4, U7, U6]
Quand je fais ceci:
for (Map<String, String> map : getUrlAttachments()) {
String tmpId = map.get("id"); //it receives the U2, in the 1st iteration, then U3, then U1,...
if (tmpId.charAt(0) == 'U') {
tmpId.charAt(1);//2, then 3, then 1,...
String url = map.get("url");
String description = map.get("description");
URLAttachment attachment;
String cleanup = map.get("cleanup");
if (cleanup == null && url != null && description != null) {
attachment = new URLAttachmentImpl();
attachment.setOwnerClass(FileUploadOwnerClass.Event.toString());
attachment.setUrl(url);
attachment.setDescription(description);
attachment.setOwnerId(auctionHeaderID);
attachment.setUrlAttachmentType(URLAttachmentTypeEnum.EVENT_ATTACHMENT);
attachment.setDateAdded(new Date());
urlBPO.save(attachment);
}
Mon problème:
Je veux changer ce For
condition d'en passer une autre liste de cartographie des données triées comme [U1, U2, U3, U4, U5, U6, U7, U8]
.
J'aimerais votre aide pour savoir quel est le mieux que j'ai pu faire.
J'ai pensé à la création d'un tableau répertoriant les id et puis trier ensuite, mais je ne sais pas exactement comment trier des chaînes alphanumériques en java.
Jetez un oeil à TreeMap.
OriginalL'auteur periback2 | 2013-01-15
Vous devez vous connecter pour publier un commentaire.
Je décide d'utiliser l'idée @Abou a donné, mais j'ai adapté:
ArrayList
pour stocker la partie numérique de chaque id.Je sorte de cette
ArrayList
comme @Abou m'a appris dans sa réponse, puis-je vérifier pour chaque id dans cette triésArrayList
dans la séquence, il doit être ajouté..OriginalL'auteur periback2
Suffit d'utiliser
Collections.sort()
méthode après la création d'unArrayList
de vos valeurs comme ceci:De sortie :
ce problème a été mentionné ici: weblogs.java.net/blog/skelvin/archive/2006/01/...
Ouais je savais que ce serait un problème. Mais pour cela, vous pouvez créer votre propre mise en œuvre d'un comparateur ou avoir un coup d'oeil à commons.apache.org si ils ont quelque chose qui peut vous aider.
oui.. mais avant d'aller de cette façon, je vais voir si je peux supprimer le préfixe "U", et puis trier les nombres
oui, c'est aussi une bonne façon
OriginalL'auteur Abubakkar
Créer un personnalisé
Comparator<Map<String,String>>
:et ensuite utiliser
Arrays.sort(urlAttachments, new IdComparator());
avant d'effectuer une itération sur elle. En fonction de détails, vous pouvez pousser cette logique de tri dansgetUrlAttachments()
et de garder le code que vous avez posté exactement comme il est maintenant.Oui, il utilise l'ordre alphabétique; apparemment, vous avez besoin l'ordre numérique à la place. La même approche s'applique pour que, trop; il y aura un peu plus de codage de votre part de traiter les chaînes de code de façon appropriée. Voir édité code.
que dois-je mettre dans la coutume Comparateur de<Map<String, String>> classe?
Si vous avez lu ma réponse, vous trouverez le code complet.
OriginalL'auteur Marko Topolnik
Je pense que ce que vous demandez est similaire à ceci :
http://www.davekoelle.com/alphanum.html
Vous pouvez rompre la chaîne en pure chaîne et de la chaîne numérique.
pour l'e.g: abc123 serait divisé en "abc" et "123"
Vous pouvez comparer chaîne alphabétique avec la normale de comparaison, puis à trier "123" ce genre de chaînes, vous avez deux options:
1: Convertir en Entier, puis de les comparer
2: Si le nombre ne rentre pas en Entier, vous pouvez comparer lettre par lettre.
pour par exemple "123" vs "133"
comparer "1" et "1" = égal
Comparer "2" et "3" = plus, de sorte "123" < "133".
L'Option 2 est plus précis et moins d'erreur de la preuve.
OriginalL'auteur Gaurav