我是编程和学习java的新手。我正在努力让这个switch语句用于替换字符串中的元音然后打印新字符串。我一直在找不到ChangeV的符号。另外,不确定我如何迭代我的字符串来检查元音然后替换每个元音。我想从用户那里获取输入但又不清楚如何正确合并。谢谢你的帮助!
public class Main{
public static void main(String args[]){
//Scanner myScanner = new Scanner(System.in);
//String s = myScanner.next();
ChangeV v = new ChangeV();
System.out.println(v.ChangeV());
}
public void ChangeV(){
String s = "aeiou";
char [] vowels ={'a', 'e' ,'i', 'o','u'};
// I believe I would need a for loop
switch (//not sure what goes here) {
case'a' :
s.replace('a', 'e');
break;
case 'e' :
s.replace('e', 'i');
break;
case 'i' :
s.replace('i', 'o');
break;
case 'o' :
s.replace('o', 'u');
break;
case 'u' :
s.replace('u', 'a');
break;
}
}
}
}
你接近的方式有两个问题。
s.replace('a', 'e');
不会替换字符串中的任何字符,因为String
对象在Java中是不可变的。如果你把它作为s
分配给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);
}
}
你写了这一行:
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.
}
}
我相信duffymo's answer已经隐瞒了你的方法使用的问题所以我只会提到使用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''我'等等,直到每个'你'成为'a'。好的,我们可以在修改之后反转ordre来寻找元音:
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' );
但是我们仍然有一个'u'的问题,最终在'e'(暂时'a')。因此,解决方法是使用临时字符,但如何确保它尚未在您的文本中使用:
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
回到开头)
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