3 回答

TA貢獻2021條經驗 獲得超8個贊
你接近的方式有兩個問題。
s.replace('a', 'e');
不會替換字符串中的任何字符,因為String
對象在 Java 中是不可變的。s
僅當您將其分配回as時,它才會替換s = s.replace('a', 'e');
以這種方式替換循環中字符串的每個字符的問題是,在每次下一次迭代中,
replace
如果匹配該字符,它甚至會替換任何過去的字符。所以本質上,“aeiou”最后會變成“aaaaa”,因為在最后一個字符處,你會s = s.replace('u', 'a');
用 . 替換每個字符a
。
因此,要替換字符串中的字符,下面是一種更好的方法:
public static void main(String[] args){
String oldString = "aeiou";
char[] characters = oldString.toCharArray();
for (int i = 0; i < characters.length; i++) {
switch (characters[i]) {
case 'a':
characters[i] = 'e';
break;
case 'e':
characters[i] = 'i';
break;
case 'i':
characters[i] = 'o';
break;
case 'o':
characters[i] = 'u';
break;
case 'u':
characters[i] = 'a';
break;
default:
break;
}
}
String newString = String.valueOf(characters);
System.out.println(oldString);
System.out.println(newString);
}
如果您想用用戶輸入的任何字符串替換元音,您可以使用Scanner通過控制臺讀取用戶的輸入,它可以實現如下。
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String oldString = scanner.next();
String newString = changeVowels(oldString);
System.out.println(newString);
scanner.close();
}
private static String changeVowels(String oldString) {
char[] characters = oldString.toCharArray();
for (int i = 0; i < characters.length; i++) {
switch (characters[i]) {
case 'a':
characters[i] = 'e';
break;
case 'e':
characters[i] = 'i';
break;
case 'i':
characters[i] = 'o';
break;
case 'o':
characters[i] = 'u';
break;
case 'u':
characters[i] = 'a';
break;
default:
break;
}
}
return String.valueOf(characters);
}
}

TA貢獻1828條經驗 獲得超13個贊
你寫了這一行:
ChangeV v = new ChangeV();
您是在告訴編譯器有一個以ChangeV無參數構造函數命名的類。
我在您的代碼中沒有看到這樣的類,只有public class Main.
你還寫了這一行:
public void ChangeV(){
這是不正確的,因為它超出了Main類中的大括號。Java 是一種面向對象的語言。每個函數都必須出現在類定義中。像 Python 這樣的語言是不同的:您可以在源文件中自己定義一個函數。在 Java 中并非如此。
如果它在大括號內,Main它將是Main名為的類上的一個方法ChangeV,它不接受任何參數并返回void。
那不是構造函數。
構造函數是一種特殊的方法,它與它所屬的類同名,并且沒有返回類型。
這是一個沒有參數的構造函數:
public ChangeV() {
// initialize the instance in here.
}
我不認為你想要那個。
這就是我認為你想要的:
public class VowelChanger {
public static void main(String [] args) {
for (String arg : args) {
System.out.println(String.format("before: %s after: %s", arg, changeVowels(args));
}
}
public static String changeVowels(String s) {
// put your code to replace vowels here.
}
}

TA貢獻1864條經驗 獲得超6個贊
我相信duffymo 的回答已經掩蓋了您的方法使用問題,所以我將簡單地提及使用replace
問題s = s.replace('a', 'e');
String.replace
將替換每一次出現,所以你可以簡單地連續調用它 5 次:
s = s.replace( 'a', 'e' );
s = s.replace( 'e', 'i' );
s = s.replace( 'i', 'o' );
s = s.replace( 'o', 'u' );
s = s.replace( 'u', 'a' );
但是你最終只會得到'a',因為每個'a'都會變成'e',然后每個'e''i'等等,直到每個'u'都變成'a'。好的,我們可以在 where modify 之后反轉順序以查找元音:
s = s.replace( 'u', 'a' );
s = s.replace( 'o', 'u' );
s = s.replace( 'i', 'o' );
s = s.replace( 'e', 'i' );
s = s.replace( 'a', 'e' );
但是我們仍然對以“e”(暫時是“a”)結尾的“u”有問題。因此,一種解決方法是使用臨時字符,但如何確保它尚未在您的文本中使用:
s = s.replace( 'u', '*' ); //don't set it to 'a' directly
s = s.replace( 'o', 'u' );
s = s.replace( 'i', 'o' );
s = s.replace( 'e', 'i' );
s = s.replace( 'a', 'e' );
s = s.replace( '*', 'a' ); //then replace the temp character by 'a'
更好的解決方案是處理文本,一次處理一個字符。如果你找到一個元音,你就改變它。
我的解決方案將使用數組來減少冗長,并讓索引為您提供下一個元音。(% array.length如果您在最后一個元音之后,則使用 a 從開頭返回)
static char [] vowels ={'a', 'e' ,'i', 'o','u'};
public static String changeV(String s){
char[] chars = s.toCharArray(); //transform a String in an array of character
for ( int i = 0; i < chars.length; ++i ) { //iterate the array
int index = Arrays.binarySearch( vowels, chars[i] ); //look for the current character in the vowels array and get his index
if ( index > -1 ) // is it a vowels
chars[i] = vowels[( index + 1 ) % vowels.length]; // change with the next vowels
}
return new String(chars); //create a nez String with the result
}
這會給你:
changeV( "aeiou" ); //eioua
changeV( "This is a test" ); //Thos os e tist
changeV( "Hello world" ); //Hillu wurld
添加回答
舉報