对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;
}
}
}
}
答案 0 :(得分:2)
您的处理方式有两个问题。
s.replace('a', 'e');
将不会替换字符串中的任何字符,因为String
对象在Java中是不可变的。仅当您将其重新分配为s
的{{1}}时才会替换s = s.replace('a', 'e');
甚至会替换任何过去的字符(如果与该字符匹配)。因此,从本质上讲,“ aeiou”在末尾将变为“ aaaaa”,因为在最后一个字符处,您将拥有replace
,它将用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
答案 1 :(得分:1)
您写了这一行:
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.
}
}
答案 2 :(得分:0)
我相信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”都变成“ i”,直到每个“ u”都变成“ 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' );
但是我们仍然遇到以'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
返回开头)
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