使用switch语句将以下元音替换为字符串中的每个元音

问题描述 投票:1回答:3

我是编程和学习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;
}

}
    }

}
java switch-statement
3个回答
2
投票

你接近的方式有两个问题。

  1. s.replace('a', 'e');不会替换字符串中的任何字符,因为String对象在Java中是不可变的。如果你把它作为s分配给s = s.replace('a', 'e');,它只能取代
  2. 以这种方式替换循环中字符串的每个字符的问题是,在每次下一次迭代时,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);
    }
}

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.
    }
}

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''我'等等,直到每个'你'成为'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
© www.soinside.com 2019 - 2024. All rights reserved.