J'ai donc un champ textField où vous devez entrer votre texte "codé" et le faire traduire dans un langage non codé en utilisant .replace pour supprimer certains caractères. Mais je ne peux pas le faire fonctionner.
Il y a un "langage de code" pour enfants où vous prenez un mot, comme chat et pour chaque consonne, vous ajoutez un "o" et la consonne à nouveau. Donc un "b" serait "bob". Avec les voyelles, elles restent telles qu'elles sont. Le chat serait cocatot.
fun translateBack(view : View) { val konsonanter = "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ" var input = editText.text.toString() var emptyString = "" for(i in konsonanter) { val find_text = i + "o" + i var conso = i.toString() textView.text = input.replace(find_text, conso, false) } }
Je voudrais qu'il supprime les deux lettres suivantes pour chaque consonne (si possible). Donc, si j'entre "cocowow", je devrais sortir "vache". Pour le moment, je viens de récupérer ce que je saisis dans le champ textField ...
3 Réponses :
Le problème est que vous définissez le texte dans textView
dans chaque boucle et que vous ne mettez jamais à jour input
. Donc, vous ne voyez essentiellement que le résultat de l'appel replace
qui se produit avec les paramètres "ZoZ"
et "Z"
à la fin de la boucle, avec input
toujours la chaîne d'origine.
Au lieu de cela, vous pouvez continuer à mettre à jour input
, puis définir le texte lorsque vous avez terminé:
val konsonanter = "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ" var input = editText.text.toString() var emptyString = "" for (i in konsonanter) { val find_text = i + "o" + i val conso = i.toString() input = input.replace(find_text, conso, false) } textView.text = input
Utilisez une boucle forEach
à travers les caractères de input
et remplacez:
konsonanter.forEach { input = input.replace("${it}o${it}", "${it}", false) } textView.text = input
Je ne sais pas si OP en a besoin, mais cela ne fonctionnerait pas pour "Bob" (B majuscule au début). J'en ai parlé dans ma réponse.
@WilliMentzel si input
est "Bob" alors le résultat est "Bob" également à cause de false
pour le < argument code> ignoreCase . Pourquoi dites-vous que cela ne fonctionnerait pas pour "Bob"?
«Bob» ne devrait-il pas être transformé en «b»? peut-être que je l'ai mal compris
Non, "bob" doit être tourné vers "b" et "BoB" doit être tourné vers "B".
peut-être que vous connaissez ce jeu mieux que moi, je ne pense pas que ce soit clair d'après la question ... qui sait. bonne réponse de toute façon.
Je n'avais jamais entendu parler de ce jeu auparavant. Je viens de deviner par le code de l'OP.
Si vous utilisez la fonction remplace par une expression régulière et une fonction de transformation en tant que paramètres, vous pouvez créer une fonction d'extension complètement concise et complètement autonome:
println("bob".translateBack()) // b println("cocatot".translateBack()) // cat println("coCatot".translateBack()) // cat
Explication:
The Regex correspondra à toutes les mêmes consonnes (peu importe le cas) autour d'un "o". Pour garantir que la consonne avant et après le "o" est la même, une backreference à le premier groupe a été utilisé.
Donc, cela fonctionnera aussi pour des cas comme "coCatot".
Utilisation:
fun String.translateBack() = with(Regex("([bcdfghjklmnpqrstvwxz])o\\1", RegexOption.IGNORE_CASE)) { replace(this) { "${it.value.first()}" } }