Je traduis un programme C en Java dans le cadre de mon travail de module uni Java.

J'ai une fonction destinée à inverser l'ordre d'une chaîne. Lors de l'affectation à une position de la chaîne passée à la fonction, Eclipse IDE me dit "Le type de l'expression doit être un type tableau mais il est résolu en String".

public static void changeString(String message) {
        int len  = message.length();
        int i;
        
        for (i=0;i < len/2; i++) {
            char temp = message.charAt(i);
            message[i] = message.charAt(len-i-1); //error message here
            message[len-i-1] = temp;              //error message here
        }
    }

Je ne sais pas pourquoi il y a un problème avec les types de données dans l'expression - pour moi, cela devrait fonctionner correctement. Peut-être que parce que j'indexe un tableau, il est de type tableau, même si message est une chaîne?

Toute aide serait très appréciée. Merci

Java 15.0.2, Windows 10, Eclipse 2020-12 (4.18.0)

-1
oisinvg 11 févr. 2021 à 00:14

2 réponses

Meilleure réponse

String n'est pas un tableau (il en utilise un, dans les coulisses, mais le type lui-même ne l'est pas), et message[i], est illégal, en Java, si vous voulez accéder à i th élément de la chaîne, référencé par message.

obj[index] est le tableau accédez à l'expression et si votre objectif est d'écrire un algorithme qui inverse la chaîne, il est probablement logique de d'abord convertir votre chaîne en tableau de caractères, comme:

char[] msg = message.toCharArray();

Puis opérez sur ce tableau;

Et enfin reconvertissez votre tableau en chaîne, comme:

String convertedString = new String(msg);

String est un type immuable, en Java; en conséquence, travailler avec la même référence de String n'a aucun sens, car (1) vous allez générer un nouvel objet pour chaque opération (horrible pour la complexité de l'espace) sur string, et (2) cela signifie que vous allez < em> pas construire efficacement une nouvelle chaîne à partir de l'ancienne.

1
Giorgi Tsiklauri 11 févr. 2021 à 13:21

Comme String est immuable, vous devez renvoyer un nouvel objet String et utiliser un tableau temporaire:

 public static String changeString(String message) {
    int len  = message.length();
    char[] arr = new char[len];
    int i;

    for (i=0;i <= len/2; i++) {
        char temp = message.charAt(i);
        arr[i] = message.charAt(len-i-1);
        arr[len-i-1] = temp;
    }

   return new String(arr);
}

Ou vous pouvez créer un nouvel objet StringBuilder et utiliser la méthode inverse:

public static String changeString(String message) {
    return new StringBuilder(message).reverse().toString();
}
0
Sergey Afinogenov 11 févr. 2021 à 00:03