web-dev-qa-db-fra.com

Supprimer tous les caractères non alphabétiques d'un tableau de chaînes en java

J'essaie d'écrire une méthode qui supprime tous les caractères non alphabétiques d'un String[] Java, puis convertit la chaîne en chaîne minuscule. J'ai essayé d'utiliser l'expression régulière pour remplacer l'occurrence de tous les caractères non alphabétiques par "". Cependant, la sortie que je reçois ne peut pas le faire. Voici le code

static String[] inputValidator(String[] line) {
    for(int i = 0; i < line.length; i++) {
       line[i].replaceAll("[^a-zA-Z]", "");
       line[i].toLowerCase();
    }
    return line;
}

Cependant, si j'essaie de fournir une entrée qui ne contient pas d'alphabet (par exemple, - ou .), la sortie est également composée d'eux, car ils ne sont pas supprimés.

Exemple d'entrée

A dog is an animal. Animals are not people.

Sortie que je reçois

A
dog
is
an
animal.
Animals
are
not
people.

Résultat attendu

a
dog
is
an
animal
animals
are
not
people
19
hytriutucx

Le problème est que vos modifications ne sont pas stockées car les chaînes sont immuables . Chacun des appels de méthode renvoie une nouvelle String représentant le changement, la String actuelle restant la même. Il vous suffit de stocker la String renvoyée dans le tableau.

line[i] = line[i].replaceAll("[^a-zA-Z]", "");
line[i] = line[i].toLowerCase();

Étant donné que chaque méthode renvoie String, vous pouvez chaîner vos appels de méthode ensemble. Cela effectuera le deuxième appel de méthode sur le résultat du premier, vous permettant ainsi de faire les deux actions sur une seule ligne.

line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase();
37
n00begon

Vous devez affecter le résultat de votre expression rationnelle à la ligne [i].

for ( int i = 0; i < line.length; i++) {
  line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase();
}
5
paulsm4

Cela ne fonctionne pas parce que les chaînes sont immuables, vous devez définir une valeur

line[i] = line[i].toLowerCase(); 
2
Sean F

Vous devez réaffecter le résultat de toLowerCase() et replaceAll() à line[i], car Java String est immuable (sa valeur interne ne change jamais et les méthodes de la classe String renverront un nouvel objet String au lieu de modifier l'objet String.

2
nhahtdh

Comme il a déjà répondu, je viens de penser à partager un autre moyen qui n'a pas été mentionné ici>

 str = str.replaceAll("\\P{Alnum}", "").toLowerCase();
1
saurav

Une façon cool (mais un peu lourde, si vous n'aimez pas le casting) de faire ce que vous voulez faire est de parcourir toute la chaîne, index par index, en convertissant chaque résultat de String.charAt (index) en (octet), et puis en vérifiant si cet octet est soit a) dans la plage numérique des caractères alphabétiques minuscules (a = 97 à z = 122), auquel cas le reconvertir en caractère et l'ajouter à une chaîne, un tableau ou quoi -Avez-vous ou b) dans la plage numérique des caractères alphabétiques majuscules (A = 65 à Z = 90), auquel cas ajoutez 32 (A + 22 = 65 + 32 = 97 = a) et transposez-le en et ajoutez-le. S'il ne figure dans aucune de ces plages, jetez-le simplement.

1
CosmicComputer

Vous pouvez également utiliser Arrays.setAll pour cela:

Arrays.setAll(array, i -> array[i].replaceAll("[^a-zA-Z]", "").toLowerCase());
0
Alex