使用switch语句

时间:2019-04-24 16:25:23

标签: java switch-statement

对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;
}

}
    }

}

3 个答案:

答案 0 :(得分:2)

您的处理方式有两个问题。

  1. s.replace('a', 'e');将不会替换字符串中的任何字符,因为String对象在Java中是不可变的。仅当您将其重新分配为s的{​​{1}}时才会替换
  2. 以这种方式替换循环中字符串的每个字符的问题是,在每次下一次迭代中,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