检查字符串是否包含char数组的值

时间:2018-03-28 04:02:41

标签: java python-3.x

自从我用java编程以来,已经有一段时间了,今天我正在尝试用如何使用它来改变我的记忆。 (因为我正准备接受java采访)我试图在包含句子的字符串中找到元音并返回找到多少个元音。

在python中,我就是这样做的。

vowels = ('a', 'e', 'i', 'o', 'u') #tuple containing vowels
sentence = "Refreshing my memory on java"
vowels_count = 0;
consonant_count = 0;
for s in sentence:
    if s in vowels:
        vowels_count += 1
    else:
        if s.isalpha():
            consonant_count += 1

print(vowels_count)
print(consonant_count)

我尝试在java中做类似的事情但不知怎的,我的辅音计数总是错误的。我该如何解决?

String sentence2 = "Refreshing my memory on java";
char[] lookout = {'a', 'e', 'i', 'o', 'u'};
int vowels = 0;
int consonants = 0;
for (int i=0; i < sentence2.length(); i++) {
        for (int j = 0; j < lookout.length; j++) {
            if (sentence2.charAt(i) == lookout[j]) {
                vowels++;
            } else {
                if (Character.isLetter(sentence2.charAt(j))) {
                    consonants++;
                }
            }
        }
    }

System.out.print(String.format("vowels count is %d consonant count is %d \n", vowels, consonants));

7 个答案:

答案 0 :(得分:3)

Character.isLetter(sentence2.charAt(j))

以上必须是

Character.isLetter(sentence2.charAt(i))

(j只能在0到4之间变化。所以你继续从字符串中挑选前四个字符)

此外,y何时成为元音;)

但是你不能在for循环中这样做,因为你会计算一个辅音5次。

您可以使用flag来表示是否找到了元音。如果不是,你增加辅音计数

for (int i=0; i < sentence2.length(); i++) {
    boolean vowel = false;
    for (int j = 0; j < lookout.length; j++) {
        if (sentence2.charAt(i) == lookout[j]) {
            vowel = true;
            vowels++;
            break; //A vowel is found
        }
    }
    if (!vowel && Character.isLetter(sentence2.charAt(i))) {
        consonants++;
    }
}

更好的方法是使用列表或集合,并使用this answer中的contains方法。

答案 1 :(得分:2)

我认为最简单的方法是创建一组元音字符,这样就可以轻松查询字符是否为元音。

这样的东西应该有用(我没有测试过,所以可能会有小错误)

final Set<Character> vowel_set = Set.of('a', 'e', 'i', 'o', 'u', 'y');
int vowels = 0;
int consonants = 0;
for (int i=0; i < sentence2.length(); i++) {

    if (vowel_set.contains(sentence2.charAt(i))) {vowels++;}
    else if (Character.isLetter(sentence2.charAt(i))) {consonants++;}

}

答案 2 :(得分:1)

使用已经提供的任何答案(我会说Antimony's答案就是我自己做过的事情)。为了避免计算空格,并考虑大写元音,你可以这样做:

String fixedStr = sentence2.replace(" ", "").trim().toLowerCase();

然后在执行fixedStr次检查时使用#charAt(int)

然而,使用Anitmony's回答,它将是

String sentence2 = "Refreshing my memory on java";
String fixedStr = sentence2.replace(" ", "").trim().toLowerCase();

Set<Character> lookout = new TreeSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u'));

int vowels = 0;
int consonants = 0;

for(int i = 0; i < fixedStr.length(); i++) {
    if(lookout.contains(fixedStr.charAt(i))) vowels++;
    else consonants++;
}

System.out.print(String.format(
            "total characters to check is %d (%d with whitespace), vowels " +
            "count is %d, consonant count is %d, which adds up to %d \n",
            fixedStr.length(), sentence2.length(), vowels, consonants,
            vowels + consonants));
在Java 9及更高版本中,

Set<Character> lookout = new TreeSet(...)可以替换为Set<Character> lookout = TreeSet.of('a'...);

答案 3 :(得分:1)

首先将源字符串转换为大写或小写字母。

/*Convert to lower case*/
sentence2 = sentence2.toLowerCase();

现在写一个检查元音的方法。

/*Method for checking vowel or not*/
public static boolean isVowel(int ch) {
    if ("aeiou".indexOf(ch) < 0) {
        return false;
    } else {
        return true;
    }
}
Loop through your string and test the condition.

for (int i = 0; i < sentence2.length(); i++) {
    /*Check is character or not*/
    if (Character.isAlphabetic(sentence2.charAt(i))) {
        /*Check for vowel or not*/
        if (isVowel(sentence2.charAt(i))) {
            vowels++;
        } else {
            consonants++;
        }
    }

}

所以整个答案都是这样的。

public static boolean isVowel(int ch) {
    if ("aeiou".indexOf(ch) < 0) {
        return false;
    } else {
        return true;
    }
}

public static void main(String...args) {
    String sentence2 = "Refreshing my memory on java";
    int vowels = 0;
    int consonants = 0;
    /*Convert to lower case*/
    sentence2 = sentence2.toLowerCase();

    for (int i = 0; i < sentence2.length(); i++) {
        /*Check is character or not*/
        if (Character.isAlphabetic(sentence2.charAt(i))) {
            /*Check for vowel or not*/
            if (isVowel(sentence2.charAt(i))) {
                vowels++;
            } else {
                consonants++;
            }
        }
    }
    System.out.print(String.format("vowels count is %d consonant count is %d \n", vowels, consonants));
}

答案 4 :(得分:0)

当你说

} else {
    if (Character.isLetter(sentence2.charAt(j))) {
       consonants++;
   }

你基本上只是把每一个字母作为一个辅音计算你所要做的就是改变那个只是说辅音++

答案 5 :(得分:0)

感谢@ user7的回答和解释,我意识到自己的错误,并设法使我的算法运行。

for (int i = 0; i < sentence2.length(); i++) {
        for (int j = 0; j < lookout.length; j++) {
            if (sentence2.charAt(i) == lookout[j]) {
                vowels ++;
            }
        }
        if (Character.isLetter(sentence2.charAt(i))) {
            consonants++;
        }
    }
//subtracted vowel count from consonants :D
System.out.print(String.format("vowels count is %d consonant count is %d \n", vowels, consonants-vowels));

答案 6 :(得分:-1)

首先,你没有照顾大写。 其次,哪个有句子[j] ??难道不能将它作为else2 [i] in else block吗?这就是问题