18

这个Java代码给我带来了麻烦:

    String word = <Uses an input>
    int y = 3;
    char z;
    do {
        z = word.charAt(y);
         if (z!='a' || z!='e' || z!='i' || z!='o' || z!='u')) {
            for (int i = 0; i==y; i++) {
                wordT  = wordT + word.charAt(i);
                } break;
         }
    } while(true);

我想检查单词的第三个字母是否是非元音,如果是,我希望它返回非元音及其前面的任何字符。如果是元音,则检查字符串中的下一个字母,如果也是元音,则检查下一个字母,直到找到非元音。

例子:

word = Jaemeas 然后 wordT 必须 = Jaem

示例 2:

word=Jaeoimus 然后 wordT 必须 = Jaeoim

问题在于我的if陈述,我不知道如何让它检查那一行中的所有元音。

4

8 回答 8

66

检查元音的清洁方法:

public static boolean isVowel(char c) {
  return "AEIOUaeiou".indexOf(c) != -1;
}
于 2013-10-03T13:57:43.850 回答
37

你的条件有问题。考虑更简单的版本

z != 'a' || z != 'e'

如果z是,'a'则后半部分为真,因为z不是'e'(即整个条件为真),如果z'e',则前半部分为真,因为z不是'a'(再次,整个条件为真)。当然,如果z既不是'a'也不是,'e'那么这两个部分都是真的。换句话说,你的条件永远不会是假的!

您可能想要&&s 代替:

z != 'a' && z != 'e' && ...

也许:

"aeiou".indexOf(z) < 0
于 2013-10-03T13:51:44.837 回答
3

使用正则表达式的方法怎么样?如果您使用正确的模式,您可以使用组从 Matcher 对象中获取结果。在下面的代码示例中,只要存在模式匹配,对 m.group(1) 的调用就会返回您正在查找的字符串。

String wordT = null;
Pattern patternOne = Pattern.compile("^([\\w]{2}[AEIOUaeiou]*[^AEIOUaeiou]{1}).*");
Matcher m = patternOne.matcher("Jaemeas");
if (m.matches()) {
    wordT = m.group(1);
}

只是实现相同目标的稍微不同的方法。

于 2013-10-03T15:01:23.087 回答
2

实际上有更有效的方法来检查它,但既然你问过你的问题是什么,我可以说问题是你必须用 AND 运算符更改那些 OR 运算符。使用您的 if 语句,它将永远是正确的。

于 2013-10-03T13:59:20.437 回答
2

因此,万一有人遇到这种情况并想要一种可以在许多情况下使用的简单比较方法。

不管是大写还是小写。阿兹和阿兹。

布尔元音 = ((1 << 字母) & 2130466) != 0;

这是我能想到的最简单的方法。我在 C++ 和 64 位 PC 上对此进行了测试,因此结果可能会有所不同,但基本上“32 位整数”中只有 32 位可用,因为第 64 位和第 32 位被删除,执行时您的值在 1 到 26 之间“<< 字母”。

如果您不了解位的工作原理,对不起,我不会深入讨论,而是技术

1 << N 与 2^N 幂或创建 2 的幂相同。

因此,当我们执行 1 << N & X 时,我们检查 X 是否包含创建元音的 2 的幂位于该值 2130466 中。如果结果不等于 0,则它成功地是元音。

这种情况适用于您使用位的任何东西,只要值的范围是 0 到 31,即使值大于 32 的索引也可以在这种情况下工作。所以就像前面提到的字母可能是 65-90 或 97 -122 但因为我们一直删除 32 直到剩下 1-26 的余数。其余的不是它实际工作的方式,但它让您了解该过程。

如果您无法保证收到的信件,请记住一些事情,请检查信件是否低于“A”或高于“u”。因为无论如何结果总是错误的。

例如,跟随将返回一个假元音肯定。“!” 感叹号是值 33,它将提供与“A”或“a”相同的位值。

于 2019-01-30T20:35:54.987 回答
1

对于初学者,您正在检查字母是否为“not a”或“not e”或“not i”等。

假设字母是 i。那么字母不是a,所以返回“True”。那么整个陈述为真,因为 i != a。我认为您正在寻找的是将这些语句组合在一起,而不是它们。

完成此操作后,您需要查看如何增加 y 并再次检查。如果你第一次得到一个元音,你想看看下一个字符是否也是元音。这仅检查位置 y=3 处的字符。

于 2013-10-03T13:55:20.663 回答
0
 String word="Jaemeas";
 String wordT="";
        int y=3;
        char z;
        do{
            z=word.charAt(y);
             if(z!='a'&&z!='e'&&z!='i'&&z!='o'&&z!='u'&&y<word.length()){
                for(int i = 0; i<=y;i++){
                    wordT=wordT+word.charAt(i);
                    }
            break;
            }
           else{
                 y++;
             }

        }while(true);

这是我的答案。

于 2013-10-03T14:09:38.220 回答
0

我已经为 VOWELS 声明了一个 char[] 常量,然后实现了一个检查 char 是否为元音的方法(返回一个布尔值)。在我的 main 方法中,我声明了一个字符串并将其转换为一个字符数组,这样我就可以将 char 数组的索引作为我的 isVowel 方法的参数传递:

public class FindVowelsInString {

        static final char[] VOWELS = {'a', 'e', 'i', 'o', 'u'};

        public static void main(String[] args) {

            String str = "hello";
            char[] array = str.toCharArray();

            //Check with a consonant
            boolean vowelChecker = FindVowelsInString.isVowel(array[0]);
            System.out.println("Is this a character a vowel?" + vowelChecker);

            //Check with a vowel
            boolean vowelChecker2 = FindVowelsInString.isVowel(array[1]);
            System.out.println("Is this a character a vowel?" + vowelChecker2);

        }

        private static boolean isVowel(char vowel) {
            boolean isVowel = false;
            for (int i = 0; i < FindVowelsInString.getVowel().length; i++) {
                if (FindVowelsInString.getVowel()[i] == vowel) {
                    isVowel = true;
                }
            }
            return isVowel;
        }

        public static char[] getVowel() {
            return FindVowelsInString.VOWELS;
        }
    }
于 2017-07-25T23:06:13.373 回答