我正在练习一个程序,用“ E”替换所有“ S”,反之亦然。必须在几个字符串中完成此任务。
我尝试了几件事(例如使用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。
答案 0 :(得分:2)
您想做的是:
但是您总是在初始输入 x
上进行操作,因此您实际要做的是:
这是您的固定代码:
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 :(得分:1)
此行:
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
替换为E
,并且由于A
中没有SEES
,因此该字符串仍然存在保持不变。
答案 2 :(得分:1)
程序中的问题是,您没有意识到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]