/ / ce code était supposé inverser une chaîne donnée par le premier argument, mais il a une erreur de compilation - java, compiler-errors

ce code était supposé inverser une chaîne donnée par le premier argument, mais il a une erreur de compilation - java, compiler-errors

    public class ex4 {

public static void main (String args[]) throws IOException {
int strlength=length(args);
InvertString(args, strlength, 0);
}

public static int length(String args[]) {
int i=0;
int count=0;
while(Character.isLetter(args[0].charAt(i))){
count++;
i++;}
return count;
}




public static void InvertString(String args[], int i, int x){

char a= args[0].charAt(x);
args[0].charAt(x)=args[0].charAt(i-1-x);
args[0].charAt(i-1-x)=a;
x++;

if(x<(i/2)) InvertString(args,i,x);
}
}

L'erreur de compilation est ex4.java:27: erreur: type inattendu requis: variable trouvée: valeur ex4.java:28: erreur: type inattendu requis: variable trouvée: valeur

Réponses:

1 pour la réponse № 1

Votre code défie un certain nombre de conventions Java. Pour obtenir une inversion d'une chaîne, vous pouvez simplement utiliser

 String reversedString = new StringBuilder(args[0]).reverse().toString();

La longueur de la chaîne est renvoyée par la méthode length ():

int length = args[0].length();

Cependant, je prends ce code pour un exercice algorithmique, je vais donc le commenter en conséquence.

Tout d'abord, args est un tableau de chaînes, vous devriez donc échanger l'argument de String [] en String dans votre méthode InverseString, car je vois que vous voulez que args [0] String soit inversé.

Deuxièmement, c'est une mauvaise pratique de réaffecter l'argumentvaleurs dans un corps de message et il est préférable de déclarer une nouvelle variable. Les arguments sont passés par valeur en java. Par conséquent, si vous modifiez la valeur de l'argument, la méthode d'appel ne verra pas la modification. Toutefois, si l'argument est la référence à un objet mutable, vous pouvez modifier cet objet.

Troisièmement, String est immuable en Java - une fois parinstance a été créée, vous ne pouvez pas modifier le contenu, vous pouvez uniquement affecter la référence à une nouvelle chaîne. Par conséquent, votre chaîne InvertString doit changer du type de retour void au type de retour String et la méthode main doit affecter une variable à la nouvelle valeur OU vous devez déclarer un objet mutable pour stocker vos valeurs intermédiaires. Pour la manipulation des caractères, vous avez des classes StringBuffer et StringBuilder mutables. StringBuilder est plus approprié car vous n’avez pas de multithreading dans votre code.

public static void main (String args[]) throws IOException {
StringBuilder arg = new StringBuilder(args[0]);
int strlength = arg.length();
InvertString(arg, strlength, 0);
}

public static void InvertString(StringBuilder arg, int i, int x) {
char a = arg.charAt(x); //char a= args[0].charAt(x);
arg.setCharAt(x,arg.charAt(i-1-x)); //args[0].charAt(x)=args[0].charAt(i-1-x);
arg.setCharAt(i-1-x,a); // args[0].charAt(i-1-x)=a;

if( x < (i/2))
InvertString(arg,i,x + 1); // replace x++ with x + 1 to avoid argument manipulation
}

Cet algorithme compilera, cependant il a encoreune erreur - les caractères du milieu vont être remplacés deux fois (retour à l'original) dans le cas d'une chaîne de longueur égale. Je vais vous laisser comprendre la solution. Bonne chance!