Ce qui est un moyen efficace pour remplacer plusieurs caractères dans une chaîne de caractères?
La manipulation des chaînes en Java est quelque chose que je suis en train d'apprendre à bien faire. Actuellement, je veux prendre dans une chaîne de caractères et de les remplacer tous les caractères, je trouve.
Ici est mon inefficace (et un peu stupide de l'OMI) de la fonction. Il a été écrit simplement.
public String convertWord(String word)
{
return word.toLowerCase().replace('á', 'a')
.replace('é', 'e')
.replace('í', 'i')
.replace('ú', 'u')
.replace('ý', 'y')
.replace('ð', 'd')
.replace('ó', 'o')
.replace('ö', 'o')
.replaceAll("[-]", "")
.replaceAll("[.]", "")
.replaceAll("[/]", "")
.replaceAll("[æ]", "ae")
.replaceAll("[þ]", "th");
}
J'ai couru à 1.000.000 s'exécute, et il a pris 8182ms. Alors, comment dois-je procéder dans l'évolution de cette fonction pour la rendre plus efficace?
Solution trouvée:
La conversion de la fonction de cette
public String convertWord(String word)
{
StringBuilder sb = new StringBuilder();
char[] charArr = word.toLowerCase().toCharArray();
for(int i = 0; i < charArr.length; i++)
{
//Single character case
if(charArr[i] == 'á')
{
sb.append('a');
}
//Char to two characters
else if(charArr[i] == 'þ')
{
sb.append("th");
}
//Remove
else if(charArr[i] == '-')
{
}
//Base case
else
{
sb.append(word.charAt(i));
}
}
return sb.toString();
}
L'exécution de cette fonction de 1.000.000 fois prend 518ms. Donc, je pense que c'est assez efficace. Merci pour l'aide les gars 🙂
- Certains de l'emploi est ici: stackoverflow.com/questions/1008802/... . Je ne sais pas à propos de
æ
etþ
.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer un tableau de String[] qui est de Caractère.MAX_VALUE dans la longueur. (Y compris la cartographie en minuscules)
Comme les remplacements eu plus complexe, le temps d'effectuer leur restera la même.
Map<Character, String>
peut être. 😉Serait ma suggestion:
Je pense que c'est sans doute la performance la plus rapide, vous obtiendrez en Java pur.
EDIT: je remarque que vous faites des changements qui modifient la longueur de la chaîne. Dans ce cas, le même principe s'applique, cependant, vous devez garder les deux tableaux et d'un incrément à la fois un index des sources et un index de destination séparément. Vous pourriez aussi avoir besoin de redimensionner le tableau de destination si vous manquez d'espace cible (c'est à dire réaffecter un ensemble plus grand et arraycopy existants tableau de destination en elle)
StringBuilder
.Map<Character, Character>
, où les clés sont le jeu de caractères que vous souhaitez remplacer, et les valeurs correspondantes de remplacement. Cela évite leswitch
déclaration.Map<Char, String>
serait de travailler depuis que j'ai remplacer æ avec ae par exemple.Mon application est basée sur la table.
Mon premier choix serait d'utiliser un
StringBuilder
parce que vous avez besoin de supprimer certains caractères de la chaîne.Deuxième choix serait pour itérer jeter le tableau de caractères et ajouter les traités char à un autre tableau de la inicial de la taille de la chaîne. Vous devez copier le tableau de garniture du possible les positions non utilisées.
Après cela, je voudrais faire des tests de performance pour voir la sorcière est mieux.
Je doute, que vous pouvez accélérer le caractère 'remplacement' à tous vraiment. Comme pour le cas de l'expression régulière de remplacement, vous pouvez compiler le regexs à l'avance
Utiliser la fonction String.replaceAll.
Bel article similaire avec ce que vous voulez: lien
Toutes les fois que nous avons ce type de problèmes, nous utilisons les expressions régulières sont ils sont de loin le moyen le plus rapide pour faire face à ce que vous essayez de faire.
Avez-vous déjà essayé les expressions régulières?
Ce que je vois inefficace, c'est que tu vas vérifier de nouveau personnages qui ont déjà été remplacés, ce qui est inutile.
Je voudrais obtenir le charArray de la Chaîne d'instance, parcourir, et pour chaque caractère de spam une série de if-else comme ceci: