последний вывод строки кажется нетронутым

#java

#java

Вопрос:

последний системный вывод не показывает, что строка изменилась, что-нибудь пролетело над моей головой?

Это выполняет поиск позиции определенного символа и удаляет ее из строки:

 import java.util.Scanner;

public class Main {

    public static int search(String ch, char x) {
        int i;
        for ( i = 0; i < ch.length(); i  ) {
            if (ch.charAt(i) == x) {
                break;
            }
        }
        return i;
    }

    public static void decal(int x, String A) {
        for (int i = x; i < A.length() -1 ; i  ) {
            char a = A.charAt(i);
            a = A.charAt(i  1);
        }
        char e = A.charAt(A.length()-1);
        e = '';
    }

    public static void main(String[] args) {
        System.out.println("donner une chaine");
        String name;
        Scanner sc =  new Scanner(System.in);
        name = sc.nextLine();
        char w;
        System.out.println("donner un caractere");
        w = sc.next().charAt(0);
        int val = search(name, w);
        System.out.println("la position de la lettre "   w   " est "  val);
        decal(val, name);
        sc.close();
        System.out.println(name);
    }
}
  

Комментарии:

1. Как вы думаете, почему строка должна измениться? Я не вижу никакой инструкции, присваивающей новое значение переменной name . Итак, как это могло измениться?

2. Побочная проблема: форматирование вашего кода было довольно ужасным. Пожалуйста, поймите, что понять чужой код непросто, и поскольку вы хотите, чтобы мы поняли это и помогли вам, вы действительно не хотите усложнять этот процесс больше, чем это должно быть. Пожалуйста, приложите усилия для публикации хорошо отформатированного кода в будущем. Для этого не требуется много усилий, и это время потрачено не зря, и его высоко ценят участники сайта.

Ответ №1:

На самом деле, вам вообще не нужен decal метод, вы можете просто использовать метод String.replace() для замены нужного вам символа пустым символом. Например:

 public static void main(String[] args) {
    char w;
    System.out.println("donner une chaine");
    Scanner sc =  new Scanner(System.in);
    String name = sc.nextLine();
    System.out.println("donner un caractere");
    w = sc.next().charAt(0);
    int val = search(name, w);
    System.out.println("la position de la lettre "   w   " est "  val);
    name = name.replace(name.charAt(val) "", ""); //replace old character (notice conversion to String) with empty String.
    sc.close();
    System.out.println(name);
}
  

После запуска вашего search метода мы знаем позицию интересующего символа, поэтому мы можем просто использовать метод replace(), чтобы присвоить символ в этой позиции символу для замены, преобразовать его в строку и пустую строку в качестве новой замены. Это даст следующий вывод:

 donner une chaine
hello
donner un caractere
e
la position de la lettre e est 1
hllo
  

Я полагаю, вы надеялись использовать что-то вроде:

 name = name.replace(name.charAt(val), '');
  

Но имейте в виду, что таким образом вы заменяете символ символом ‘ 0’, который будет там (т. Е. это будет ‘h 0llo’), хотя вы не увидите его, когда будете печатать инструкцию из-за приведения к строке, которое происходит в фоновом режиме, и вывод будет выглядеть правильно. Если вы хотите, вы можете легко проверить это, преобразовав измененную строку в charArray и проверив, содержит ли она символ ‘ 0’. Например, простая проверка:

     String name1 = name.replace(name.charAt(val), '');    // hllo
    String name2 = name.replace(name.charAt(val) "", "");   // hllo
    String name3 = name.replace(name.charAt(val) "", ""); // hllo
    System.out.print(name1.equals(name2)); //false
    System.out.print(name1.equals(name3)); //true
  

Поэтому я бы рекомендовал использовать первый приведенный метод (с преобразованием в строку).