1. ホーム
  2. java

[解決済み] Java-Stringをpiglatinに翻訳する方法は?

2022-02-06 03:50:33

質問

ピグラタンコードを書いているのですが、単語の最初の文字が子音である場合、プログラムが次の母音がどこにあるかを識別する方法でつまづいています。そして、その単語の最初の母音までの部分を単語の最後に移動させ、それと共にayをプリントします。(例: trees = eestray)

これは、私が今持っているコードです。

// word is bringing in the string entered from the user
public static void translate(String word) {

    String wordCap, pigLatin = "";
    char vowels;
    int lowest = 0, tempOne, tempTwo, tempThree, tempFour, tempFive;  

    wordCap = word.toUpperCase();
    vowels = wordCap.charAt(0);

    if (vowels == 'A' || vowels == 'E' || vowels == 'I' || vowels == 'O' || vowels == 'U') {
            word = word + "way";
            System.out.println(word);
        }
        else {
            tempOne = wordCap.indexOf('A', 1);
            if (lowest > tempOne && tempOne != -1) {
                lowest = tempOne;
            }
            tempTwo = wordCap.indexOf('E', 1);
            if (lowest > tempTwo && tempTwo != -1) {
                lowest = tempTwo;
            }
            tempThree = wordCap.indexOf('I', 1);
            if (lowest > tempThree && tempThree != -1) {
                lowest = tempThree;
            }
            tempFour = wordCap.indexOf('O', 1);
            if (lowest > tempFour && tempFour != -1) {
                lowest = tempFour;
            }
            tempFive = wordCap.indexOf('U', 1);
            if (lowest > tempFive && tempFive != -1) {
                lowest = tempFive;
            }




public static char vowel(String word) {
    int start= 0, end= 0;
    char vowels;

    for (int i = 0; i < word.length(); i++) {
        vowels = word.charAt(i);
        if (vowels == 'A' || vowels == 'E' || vowels == 'I' || vowels == 'O' || vowels == 'U') {
            end = i;
            break;
        }
    }
    return (char) end;
}

(translateメソッドの場合)

for (int i = 0; i<wordCap.length(); i++) {
        if (vowel(wordCap.charAt(i))) {
            vowels = wordCap.charAt(i);
        }

    }

今の問題は、母音メソッドが適用可能なメソッドタイプでないことです。charでなければならないと書いてあるのですが?

どうすればいいですか?

その方法を短縮してみましょう ;)

こんな感じで試してみてください。

private static final char[] vowels = {'a', 'e', 'i', 'o', 'u'};
public static String translate(String word) {
    int start = 0; // start index of word
    int firstVowel = 0;
    int end = word.length(); // end index of word
    for(int i = 0; i < end; i++) { // loop over length of word
        char c = Character.toLowerCase(word.charAt(i)); // char of word at i, lower cased
        if(Arrays.asList(vowels).contains(c)) { // convert vowels to a list so we can use List.contains() convenience method.
            firstVowel = i;
            break; // stop looping
        }
    }
    if(start != firstVowel) { // if start is not equal to firstVowel, we caught a vowel.
        String startString = word.substring(firstVowel, end);
        String endString = word.substring(start, firstVowel) + "ay";
        return startString+endString;
    }
    return word; //couldn't find a vowel, return original
}

このスニペットが行っているのは、単語内のすべての文字を繰り返し処理し、最初の母音のインデックスを firstVowel という変数があります。次に、すべての文字を firstVowel から end に格納します。 startString . 次に、すべての文字を start から firstVowel を追加し、それを endString . 最後に、これらの文字列を連結して返すと、目的の出力が得られる。

これをテストするために System.out.println(translate("trees"));

EDITです。 リクエスト通り、配列なし。

public static String translate(String word) {
    char a = 'a';
    char e = 'e';
    char i = 'i';
    char o = 'o';
    char u = 'u';

    int start = 0;
    int firstVowel = 0;
    int end = word.length();
    for(int i = 0; i < end; i++) {
        char c = Character.toLowerCase(word.charAt(i));
        if(c == a || c == e || c == i || c == o || c == u) {
            firstVowel = i;
            break;
        }
    }
    if(start != firstVowel) {
        String startString = word.subString(firstVowel, end);
        String endString = word.subString(start, firstVowel) + "ay";
        return startString+endString;
    }
    return word;
}

ご覧のように、配列は物事をかなり短縮してくれるのです

について衒学的な考えをお持ちの方は Arrays.asList().contains() の呼び出しは、独自に定義することができます。

public static boolean containsChar(char[] lookIn, char lookFor) {
    boolean doesContainChar = false;
    for(char c : lookIn) {
        if(doesContainChar = c == lookFor)
            break;
    }
    return doesContainChar;
}