Почему нет изменений в элементах массива "z" String? - PullRequest
0 голосов
/ 06 апреля 2019

Я практикую программу, в которой я заменяю все буквы «S» на «E» и наоборот. Есть несколько строк, в которых нужно выполнить эту задачу.

Я пробовал несколько вещей (например, использование replace ()), но не могу понять, в чем дело.

int a;
Scanner s = new Scanner(System.in);
a = s.nextInt();
String[] x = new String[a];
String[] z = new String[a];
for (int i = 0; i < a; i++) {
    x[i] = s.next();
}
for (int i = 0; i < a; i++) {
    z[i]=x[i].replaceAll("S","A");
    z[i]=x[i].replaceAll("E","S");
    z[i]=x[i].replaceAll("A","E");
    System.out.println(z[i]);
}

Для строки SEES отображаемый результат должен быть ESSE, но ответом является SEES.

Ответы [ 3 ]

2 голосов
/ 06 апреля 2019

То, что вы пытаетесь сделать, это:

  1. Введите «SEES»
  2. Замените все «S» в «SEES» на «A» и получите «AEEA»
  3. Замените все "E" в "AEEA" на "S" и получите "ASSA"
  4. Замените все "A" в "ASSA" на "E" и получите "ESSE"

Но вы всегда работаете на своем начальном входе x, так что вы на самом деле делаете:

  1. Вход "SEES"
  2. Замените все "S" в "SEES" на "A" и получите "AEEA"
  3. Замените все "E" в "SEES" на "S" и получите "SSSS"
  4. Replaceвсе "A" в "SEES" с "E" и получите "SEES"

Вот ваш фиксированный код:

int a;
Scanner s = new Scanner(System.in);
a = s.nextInt();
String[] x = new String[a];
String[] z = new String[a];
for (int i = 0; i < a; i++) {
    x[i] = s.next();
}
for (int i = 0; i < a; i++) {
    z[i]=x[i].replaceAll("S","A");
    z[i]=z[i].replaceAll("E","S");
    z[i]=z[i].replaceAll("A","E");
    System.out.println(z[i]);
}

Обратите внимание на два изменения с x[i].replaceAll на z[i].replaceAll.

1 голос
/ 06 апреля 2019

Проблема в вашей программе заключается в том, что вы не понимаете, что x[i].replaceAll() не меняет значение x[i].Только возвращенное значение String имеет замененное значение.

Вы можете сделать это с одним массивом, как показано в приведенной ниже программе.

import java.util.Arrays;

public class StringReplace {
  public static void main(String[] args) {
    String[] x = new String[4];
    x[0] = "S";
    x[1] = "E";
    x[2] = "E";
    x[3] = "S";

    System.out.println("Input:  " + Arrays.toString(x));
    for (int i = 0; i < 4; i++) {
      x[i]=x[i].replaceAll("S","A");
      x[i]=x[i].replaceAll("E","S");
      x[i]=x[i].replaceAll("A","E");
    }
    System.out.println("Output: " + Arrays.toString(x));
  }
}

Результат:

Input:  [S, E, E, S]
Output: [E, S, S, E]
1 голос
/ 06 апреля 2019

С этой строкой:

z[i]=x[i].replaceAll("S","A");

Вы сохраняете изменения в z[i]. Тогда с этой строкой:

z[i]=x[i].replaceAll("E","S");

вы перезаписываете предыдущие изменения в z[i] новыми.
И, наконец, с этой строкой:

z[i]=x[i].replaceAll("A","E");

вы снова перезаписываете предыдущие изменения в z[i].
Таким образом, если ваша исходная строка SEES, то последняя строка заменит все A s на E s, и, поскольку в SEES нет A, строка остается неизменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...