Séparer la chaîne en paires clé-valeur
J'ai une chaîne comme celle-ci:
pet:cat::car:honda::location:Japan::food:sushi
Maintenant :
indique les paires clé-valeur, tandis que ::
sépare les paires.
Je tiens à ajouter les paires clé-valeur d'une carte.
Je peux réaliser cela à l'aide de:
Map<String, String> map = new HashMap<String, String>();
String test = "pet:cat::car:honda::location:Japan::food:sushi";
String[] test1 = test.split("::");
for (String s : test1) {
String[] t = s.split(":");
map.put(t[0], t[1]);
}
for (String s : map.keySet()) {
System.out.println(s + " is " + map.get(s));
}
Mais est-il un moyen efficace de faire cela?
Je ressens le code est inefficace, parce que je l'ai utilisé 2 String[]
des objets et a appelé le split
fonction deux fois.
Aussi, je suis en utilisant t[0]
et t[1]
qui pourrait jeter un ArrayIndexOutOfBoundsException
si il n'y a pas de valeurs.
source d'informationauteur v1shnu
Vous devez vous connecter pour publier un commentaire.
Vous pourriez faire un seul appel à la fonction split() et un seul passage sur la Chaîne à l'aide du code suivant. Mais cela suppose bien sûr que la Chaîne est valide en premier lieu:
Ci-dessus est probablement un peu plus efficace que votre solution, mais si vous trouvez que votre code plus clair, puis le garder, car il n'y a presque aucune chance que cette optimisation a un impact significatif sur les performances, à moins que vous faire des millions de fois. De toute façon, si c'est si important, alors vous devriez mesurer et de comparer.
EDIT:
pour ceux qui se demandent ce
::?
signifie dans le code ci-dessus: String.split() prend une expression régulière comme argument. Un séparateur est une sous-chaîne correspondant à l'expression régulière.::?
est une expression régulière qui signifie: 1 colon, suivi de 0 ou 1 du côlon. Elle permet ainsi de considérer::
et:
comme séparateurs.À l'aide de Goyave bibliothèque c'est un one-liner:
La sortie:
Cela aussi pourrait fonctionner plus rapidement que le JDK
String.split
comme elle ne crée pas une regexp pour"::"
.Mise à jour il prend même en charge correctement les cas de coin de le commentaires:
La sortie est:
Votre solution est en effet quelque peu inefficace.
La personne qui vous a donné la chaîne à analyser est aussi un peu un clown. Il y a de la norme de l'industrie des formats de sérialisation, comme JSON ou XML, pour lequel la rapidité, l'efficacité analyse existent. Inventer la roue carrée n'est jamais une bonne idée.
Première question: vous intéressez-vous? Est-il assez lent, qu'il diminue les performances de votre application? Probablement pas, mais il n'y a qu'une seule façon de le savoir. Tester les performances de votre code.
Cela dit, la plus efficace des solutions existent. Ci-dessous est un exemple
Cette solution est une machine à état fini avec seulement deux états. Il ressemble à tous les personnages que deux fois, une fois quand il teste pour une limite, et une fois quand il le copie dans la nouvelle chaîne de caractères dans votre carte. C'est le montant minimum.
Il n'est pas de créer des objets qui ne sont pas nécessaires, comme stringbuilders, des chaînes ou des tableaux, ce qui maintient la collecte de pression faible.
Il entretient de bonnes localité. Le caractère suivant sans doute est toujours dans le cache, de sorte que la recherche n'est pas cher.
Il arrive à un coût exorbitant qui n'est probablement pas la peine:
En vaut la peine? Peut-être. À quelle vitesse avez-vous besoin de cette chaîne analysée exactement?
Un rapide et sale de référence à https://ideone.com/8T7twy me dit que pour cette chaîne, cette méthode est environ 4 fois plus rapide. Pour les chaînes plus longues, la différence est probablement un peu plus.
Mais votre version est encore seulement 415 millisecondes pour 100.000 répétitions, où celui-ci est de 99 millisecondes.
Je ne sais pas c'est la meilleure approche ou pas, mais je pense que c'est une autre façon de faire la même chose sans utiliser la méthode split de deux fois
Espère que ça aidera 🙂
Votre programme est absolument parfait.
Juste parce que vous avez demandé pour une utilisation plus optimale de code.
J'ai réduit votre mémoire en prenant quelques variables, au lieu de prendre de tableaux et de stockage.
Regarder votre chaîne, il suit un crépitement.
key : value :: key : value ::....
Que pouvons-nous faire de tout cela?
obtenir la clé jusqu'à ce qu'il est
:
, une fois qu'il atteint:
d'obtenir la valeur, jusqu'à ce qu'il atteigne '::'.De sortie: