Замените каждый гласный в строке следующим гласным с помощью оператора switch - PullRequest
1 голос
/ 24 апреля 2019

Я новичок в программировании и изучении 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 ]

2 голосов
/ 24 апреля 2019

Есть две проблемы, с которыми вы приближаетесь.

  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 голос
/ 24 апреля 2019

Вы написали эту строку:

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 голосов
/ 24 апреля 2019

Я полагаю, ответ Даффимо уже решает проблему использования вашего метода, поэтому я просто упомяну проблему использования 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и так по одному, пока каждое «у» не станет «а».Хорошо, мы могли бы изменить порядок, чтобы искать гласные после того, как там изменилось:

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