Неверный вывод в маленькой программе.Почему эта строковая переменная не делает то, что я хочу? - PullRequest
0 голосов
/ 04 февраля 2019

Эта программа должна взять строку, проверить, является ли каждая буква гласной, и заменить гласные на подчеркивания.Например, если я введу some, он должен вывести s_m_.Это простое упражнение по программированию, которое я чувствую, что должен уметь.Однако я искренне озадачен и не могу сказать, что я делаю неправильно.

Я объявил массив для хранения гласных, переменную newStr, которая будет содержать обновленную строку, и я перебираю строку, сравнивая каждую букву, используя charAt(), чтобы проверить, находится ли она вvowels массив.Если это так, я добавляю _ к обновленной строке и сохраняю исходное письмо, если это не так.Окончательный вывод неверен, что я делаю не так?

char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
String newStr = "";

for (int x = 0; x < str.length(); x++) {
    char letter = str.charAt(x);

    for (int j = 0; j < vowels.length; j++) {
        if (letter == vowels[j]) {
            newStr = newStr + '_';
            break;
        } else {
            newStr = newStr + letter;
            break;
        }
    }
}

out.println(newStr);

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Это довольно просто.Просто переберите каждый символ данной строки и замените его на _, в случае если это гласный.

Использовать StringBuilder

Остерегайтесь использования String.Это неизменный в Java, поэтому для построения финальной строки вы должны использовать StringBuilder.

public static String replaceVowel(String str) {
    final IntPredicate isVowel = ch -> ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u';
    StringBuilder buf = new StringBuilder(str.length());

    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        boolean vowel = isVowel.test(Character.toLowerCase(ch));
        buf.append(vowel ? '_' : ch);
    }

    return buf.toString();
}

Использовать RegularExpression

В качестве альтернативы вы можетеиспользуйте Регулярное выражение с методом replaceAll() класса String.

private static final Pattern VOWEL = Pattern.compile("[aeiou]");

public static String replaceVowel(String str) {
    return VOWEL.matcher(str).replaceAll("_");
}

Это также правильно, поскольку в фоновом режиме replaceAll() использует StringBUilder.

0 голосов
/ 07 февраля 2019

В вашем коде проблема находится во вложенном цикле for.Я говорю это в кавычках, потому что на самом деле это никогда не зацикливается.Первая итерация j=0 немедленно прерывает цикл, поскольку либо ваше письмо равно a с (letter == vowels[0]), либо нет.В любом случае вы делаете break; и добавляете символ.Это означает, что ваш цикл может быть уменьшен до простого if-else, который проверяет, является ли буква a, и заменяет ее на _ или сохраняет ее.

Чтобы решить эту проблему, вам нужно использовать другойподход.Вы можете создать строку гласных, например «aeiouAEIOU», и использовать indexOf , чтобы проверить, является ли выбранный символ гласным.

public static String omitVowels(String input) {
    StringBuilder out = new StringBuilder(input.length());
    String vowels = "aeiouAEIOU";
    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        if (vowels.indexOf(c) >= 0) // is vowel if index not negative
            out.append('_');
        else
            out.append(c);
    }
    return out.toString();
}

indexOf(char) вернет -1, еслипредоставленный символ не является частью строки, иначе он вернет определенный индекс.Мы можем использовать это свойство, чтобы проверить, является ли символ гласным или нет.

Примеры

omitVowels("hello world") -> "h_ll_ w_rld"

omitVowels("aeiou") -> "_____"

omitVowels("TESTing") -> "T_ST_ng"

0 голосов
/ 04 февраля 2019
for (int x = 0; x < str.length(); x++) {
 char letter = str.charAt(x);
 boolean toReplace = false;
 for (int j = 0; j < vowels.length; j++) {
    if (letter == vowels[j]) {
        toReplace = true;
        break;
    }
 }
 if (toReplace) {
    newStr = newStr + "_";
 } else {
    newStr = newStr + letter;
 }
}
...