2

所以我正在编写一个名为 pig latin 的游戏程序(您可以查看 Wikipedia 的规则,但它包括取第一个辅音并将它们移到单词的后面并添加 -ay)。我需要检查这个词的开头是否有任何辅音。如果它有一个或多个辅音,则它需要从第一个辅音开始并在元音之前的最后一个辅音结束。

public void isConsonant(String word){
    char[] consonants = {'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm'
            , 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'z' };
    char[] StringArray = word.toCharArray();
    for(int dex = 0; dex < StringArray.length; dex++ ){
        char current = StringArray[dex];
    }
}

这是一个例子:

'glove' 这个词应该变成 ovelay 。我的程序输出“lovegay”。

这是我的程序(减号importsGUI东西):

public class PigLatin extends JFrame implements ActionListener {
    JTextField word = new JTextField(25);
    JButton GO = new JButton("Go");
    JLabel output = new JLabel();
    String CharNum1;
    String CharNum2;

    //The frame setup should be here

    public void isConsonant(String verify) {
        char[] consonants = { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm',
                'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'z' };
        char[] StringArray = verify.toCharArray();
        for (int dex = 0; dex < StringArray.length; dex++) {
            char current = StringArray[dex];
        }
    }

    public void game() {
        // The actual word
        String word2 = word.getText();

        // The first character
        CharNum1 = word2.substring(0, 2);
        CharNum2 = word2.substring(1, word2.length());

        // Remove the first char
        // String RevampedWord = word2.replace(CharNum1, "");
        String finalWord = CharNum2 + "-" + CharNum1 + "ay";
        output.setText(finalWord);
    }

    public void actionPerformed(ActionEvent event) {
        game();
    }

    public static void main(String[] arguments) {
        PigLatin pig = new PigLatin();
    }
}

所以我的问题是天气是否可以查看字符串是否包含辅音,并在元音之前将第一个辅音的第一个辅音创建一个子串。

提前致谢。

4

5 回答 5

3

你在吠叫错误的树......使用正则表达式:

提取直到第一个元音的所有辅音:

String initialConsonants = str.replaceAll("([^aeiouAEIOU]*).*", "$1");

只提取辅音:

String onlyConsonants = str.replaceAll("[aeiouAEIOU]", "");

或者如果您真的需要知道文本是否都是辅音:

boolean isAllConsonants = str.matches("[^aeiouAEIOU]+");
于 2013-07-03T07:00:48.643 回答
1

一种可能做你想做的事情的方法有点有趣:

假设你正在word变成猪拉丁,那么使用word.split("[aeiouAEIOU]", 2)呢?查看 docs 的文档split,它将只匹配一次正则表达式,因此返回的字符串数组将围绕单词中的第一个元音进行拆分。然后,您可以根据第一个元音是第一个字符、最后一个字符、介于两者之间还是无处可找到,将这些片段放回正确的顺序(请记住,并非所有单词都包含这五个元音中的一个)。

(请注意,split如果找到第一个元音,它将删除它,因此您必须使用它word来获取该元音,但第一个片段的大小也将是该元音的索引word。)

于 2013-07-03T15:14:13.550 回答
0

在这里,我删除了您的isConsonant函数并创建了一个新函数以获取仅包含常量的字符串的第一部分。

游戏功能通过此更改进行了修改:

public String getFirstConsonants(String verify) {
    List<Character> vowels = Arrays.asList('a', 'e', 'i', 'o', 'u'); // better finding vowels (faster)

    String firstString = "";
    for (int i = 0; i < verify.length(); i++) {
        if (!vowels.contains(verify.charAt(i)))
            firstString += verify.charAt(i); // we found a constant
        else
            break; // we found a vowel, we have already our string
        }

    return firstString;
}

public void game() {
    // The actual word
    String word2 = word.getText();

    // Lets find the first consonants
    String firstString = getFirstConsonants(word2);

    String finalWord = word2.substring(firstString.length()) + "-" + firstString + "ay";
    output.setText(finalWord);
}
于 2013-07-03T05:52:12.420 回答
0

不要写 big ,而是有一个布尔函数来检查 char 是元音

例如

public static boolean isVowel(final char ch) {
return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u';

}

检查每个字符,然后您可以轻松地将其编码出来。

于 2013-07-03T05:43:22.327 回答
0

以下是一些检测某个字符是辅音还是元音的 1 行例程:

private static boolean isVowel(char c) {
    return "aeiouAEIOU".contains(String.valueOf(c));
}

private static boolean isConsonant(char c) {
    return "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ".contains(String.valueOf(c));
}
于 2015-08-11T13:26:37.573 回答