使用 java 替换方法替换字符串中的字符
Replace characters within a string using the java replace method
我是初学者 java 程序员,我在大学课程中遇到了一个小问题。
基本上我有一个字符串,我想遍历并将字母 'a' 或 'e' 的所有实例替换为字母 'z'。例如,如果原始字符串为 "hello alan",则最终字符串应为 "hzllo zlzn"。
我们需要使用包含字符 'a' 和 'e' 的字符数组来测试字符串。
我在下面包含了我的代码,我们还需要使用 charAt() 方法。
public static void main(String[] args) {
String a = ("what's the craic?");
char letters[] = new char[]{'a', 't'};
System.out.println("Before:" + a);
System.out.println("After: " + removeCharacters(a, letters));
}
public static String removeCharacters(String sentence, char[] letters) {
for (int i = 0; i < sentence.length(); i++) {
for (int j = 0; j < letters.length; j++) {
if (sentence.charAt(i) == letters[j]) {
sentence = sentence.replace(sentence.charAt(i), 'z');
} else {
sentence = "No changes nessesary";
}
}
}
return sentence;
}
请帮我解决这个问题。我不确定我哪里错了!谢谢
试试这个:
public static void main(String[] args) {
String a = "hello alan";
System.out.println("Before:" + a);
System.out.println("After: " + removeCharacters(a));
}
public static String removeCharacters(String sentence) {
if (!sentence.contains("a|e"))
return "No changes necessary";
return sentence.replaceAll("a|e", "z");
}
输出 1:
Before:hello alan
After: hzllo zlzn
输出 2:
Before:hi world
After: No changes necessary
因为你被迫使用 charAt(...)
,一种方法是这样的:
public static String removeCharacters(String sentence, char[] letters) {
String output = "";
boolean wasChanged = false;
for (int i = 0; i < sentence.length(); i++) {
char ch = sentence.charAt(i);
for (int j = 0; j < letters.length; j++)
if (ch == letters[j]) {
ch = 'z';
wasChanged = true;
break;
}
output += ch;
}
if (wasChanged)
return output;
else
return "No changes necessary";
}
由于 String::replace(char oldChar, char newChar) returns 是用 newChar
替换此字符串中所有出现的 oldChar
产生的新字符串,因此您不需要嵌套循环来完成它。一种有效的方法如下:
public static String removeCharacters(String sentence, char[] letters) {
String copy = sentence;
for (char letter : letters) {
sentence = sentence.replace(letter, 'z');
}
if (sentence.equals(copy)) {
sentence = "No changes nessesary";
}
return sentence;
}
演示:
public class Main {
public static void main(String[] args) {
// Test
System.out.println(removeCharacters("hello Whosebug", new char[] { 'a', 'e' }));
System.out.println(removeCharacters("world", new char[] { 'a', 'e' }));
}
public static String removeCharacters(String sentence, char[] letters) {
String copy = sentence;
for (char letter : letters) {
sentence = sentence.replace(letter, 'z');
}
if (sentence.equals(copy)) {
sentence = "No changes nessesary";
}
return sentence;
}
}
输出:
hzllo stzckovzrflow
No changes nessesary
如果您也被允许使用 replaceAll
"hello alan".replaceAll( "[ae]", "z" ); // hzllo zlzn
不同于replace
在内部使用replaceAll
一个Pattern
,它是根据第一个参数[ae]
编译的,以找到要用第二个参数替换的部分z
。这个解决方案很短,但是很慢,因为每次调用 replaceAll
时都必须编译 Pattern
。
否则使用StringBuilder
char[] letters = new char[] { 'a', 'e' };
StringBuilder buf = new StringBuilder( "hello alan" );
IntStream.range( 0, buf.length() ).forEach( i -> {
for( char c : letters )
if( buf.charAt( i ) == c )
buf.replace( i, i + 1, "z" );
} );
String s = buf.toString(); // hzllo zlzn
与 String
不同,StringBuilder
的内容是相互的(意味着您可以更改它)。所以它只需要创建一次,所有的替换都可以就地进行。
我是初学者 java 程序员,我在大学课程中遇到了一个小问题。
基本上我有一个字符串,我想遍历并将字母 'a' 或 'e' 的所有实例替换为字母 'z'。例如,如果原始字符串为 "hello alan",则最终字符串应为 "hzllo zlzn"。
我们需要使用包含字符 'a' 和 'e' 的字符数组来测试字符串。
我在下面包含了我的代码,我们还需要使用 charAt() 方法。
public static void main(String[] args) {
String a = ("what's the craic?");
char letters[] = new char[]{'a', 't'};
System.out.println("Before:" + a);
System.out.println("After: " + removeCharacters(a, letters));
}
public static String removeCharacters(String sentence, char[] letters) {
for (int i = 0; i < sentence.length(); i++) {
for (int j = 0; j < letters.length; j++) {
if (sentence.charAt(i) == letters[j]) {
sentence = sentence.replace(sentence.charAt(i), 'z');
} else {
sentence = "No changes nessesary";
}
}
}
return sentence;
}
请帮我解决这个问题。我不确定我哪里错了!谢谢
试试这个:
public static void main(String[] args) {
String a = "hello alan";
System.out.println("Before:" + a);
System.out.println("After: " + removeCharacters(a));
}
public static String removeCharacters(String sentence) {
if (!sentence.contains("a|e"))
return "No changes necessary";
return sentence.replaceAll("a|e", "z");
}
输出 1:
Before:hello alan
After: hzllo zlzn
输出 2:
Before:hi world
After: No changes necessary
因为你被迫使用 charAt(...)
,一种方法是这样的:
public static String removeCharacters(String sentence, char[] letters) {
String output = "";
boolean wasChanged = false;
for (int i = 0; i < sentence.length(); i++) {
char ch = sentence.charAt(i);
for (int j = 0; j < letters.length; j++)
if (ch == letters[j]) {
ch = 'z';
wasChanged = true;
break;
}
output += ch;
}
if (wasChanged)
return output;
else
return "No changes necessary";
}
由于 String::replace(char oldChar, char newChar) returns 是用 newChar
替换此字符串中所有出现的 oldChar
产生的新字符串,因此您不需要嵌套循环来完成它。一种有效的方法如下:
public static String removeCharacters(String sentence, char[] letters) {
String copy = sentence;
for (char letter : letters) {
sentence = sentence.replace(letter, 'z');
}
if (sentence.equals(copy)) {
sentence = "No changes nessesary";
}
return sentence;
}
演示:
public class Main {
public static void main(String[] args) {
// Test
System.out.println(removeCharacters("hello Whosebug", new char[] { 'a', 'e' }));
System.out.println(removeCharacters("world", new char[] { 'a', 'e' }));
}
public static String removeCharacters(String sentence, char[] letters) {
String copy = sentence;
for (char letter : letters) {
sentence = sentence.replace(letter, 'z');
}
if (sentence.equals(copy)) {
sentence = "No changes nessesary";
}
return sentence;
}
}
输出:
hzllo stzckovzrflow
No changes nessesary
如果您也被允许使用 replaceAll
"hello alan".replaceAll( "[ae]", "z" ); // hzllo zlzn
不同于replace
在内部使用replaceAll
一个Pattern
,它是根据第一个参数[ae]
编译的,以找到要用第二个参数替换的部分z
。这个解决方案很短,但是很慢,因为每次调用 replaceAll
时都必须编译 Pattern
。
否则使用StringBuilder
char[] letters = new char[] { 'a', 'e' };
StringBuilder buf = new StringBuilder( "hello alan" );
IntStream.range( 0, buf.length() ).forEach( i -> {
for( char c : letters )
if( buf.charAt( i ) == c )
buf.replace( i, i + 1, "z" );
} );
String s = buf.toString(); // hzllo zlzn
与 String
不同,StringBuilder
的内容是相互的(意味着您可以更改它)。所以它只需要创建一次,所有的替换都可以就地进行。