如何检查数组是否包含特定数量的值?

时间:2019-02-12 10:02:16

标签: java arrays string

import java.util.Scanner;

public class CountVowel{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);

获取数组的大小:

        System.out.println("Type how many words will be typed: ");
        int input = scan.nextInt();    

使用字符串值填充数组

        String[] ar1 = new String[input];
        for(int i = 0; i < ar1.length; i++){
            System.out.println("Type the elements of array with words: ");
            ar1[i] = scan.next();      
        }

程序输出:

        System.out.println( input + " words are typed and " + 
        countVowels(ar1) + 
         " of them contain more than 3 vowels.");
    }

计算元音的方法:

    public static int countVowels(String[] ar1){  // this method counts 

        int a = 0;
        String[] ar2 = new String[]{"a", "e", "i", "u", "y", "o"};
        for(int i = 0; i < ar1.length; i++){
            for(String s : ar2){
                if(ar1[i].toLowerCase().contains(s)){
                    a++;
                }
            }
        }
        return a;
    }
}

上面的方法是检查元音,但是我不知道如何使它检查 元音超过3个。

7 个答案:

答案 0 :(得分:2)

使用replaceAll方法的另一种解决方案。 主要思想是从word.length()减去不带元音的相同单词长度。并检查差异。

public static int countVowels(String[] ar1){
    int a = 0;
    for (String word : ar1) {
        int i = word.length() - word.toLowerCase().replaceAll("[aeyiuo]", "").length();
        if (i >= 3) {
            a++;
        }
    }
    return a;
}

或者您也可以按照@pkgajulapalli的建议使用matches()。使用流api可以非常简洁:

long count = Arrays.stream(words)
        .filter(s -> s.toLowerCase().matches("(.*[aeyiuo].*){3,}"))
        .count();

答案 1 :(得分:1)

public static int countVowels(String[] ar1) { // this method counts

    int vowelPerWord = 0;
    int totalWordsWithThreeVowels = 0;
    char[] ar2 = new char[] { 'a', 'e', 'i', 'u', 'y', 'o' };
    for (int i = 0; i < ar1.length; i++) {
        vowelPerWord = 0;
        for (int j = 0; j < ar1[i].length(); j++) {
            for (int k = 0; k < ar2.length; k++) {
                if (ar2[k] == (ar1[i].charAt(j))) {
                    vowelPerWord++;
                }
            }
        }
        if (vowelPerWord >= 3) {
            totalWordsWithThreeVowels++;
        }
    }
    return totalWordsWithThreeVowels;
}

编辑

好了,现在我更正了错误,并编辑了变量名,使其更加有意义。尽管我相信这是O(n * m)(其中n是字符串的数量,m是最长的字符串具有的char的数量)(不是很好的复杂性),但在这种情况下它可以完成工作ar1是您的输入字符串,ar2就是存在的元音。

因此,您遍历ar1中的每个字符串并将“ vowelPerWord”设置为0,遍历每个字符串中的每个字符,并检查它是否是元音,在遍历每个字符后,将vowelPerWord增大1。在该字符串中检查是否有3个或更多的元音,如果是3个或更多,请增加totalWordsWithThreeVowels,最后返回。

答案 2 :(得分:1)

您需要的是附加的循环和计数。像这样:

// This method counts how many words have at least 3 vowels
public static int countVowels(String[] wordsArray){
  int atLeastThreeVowelsCount = 0;
  for(String word : wordsArray){
    int vowelCount = 0;
    for(String vowel : new String[]{ "a", "e", "i", "u", "y", "o" }){
      if(word.toLowerCase().contains(vowel)){
        vowelCount++;
      }
    }
    if(vowelCount >= 3){
      atLeastThreeVowelsCount++;
    }
  }
  return atLeastThreeVowelsCount;
}

Try it online.

请注意,我还为变量赋予了一些更有用的名称,而不是ar1s等,因此更容易阅读正在发生的事情。

答案 3 :(得分:0)

您可以使用正则表达式匹配来查找字符串是否包含任何字符集。例如,如果要查找字符串中是否包含任何元音,则可以使用:

String str = "yydyrf";
boolean contains = str.toLowerCase().matches(".*[aeiou].*");
System.out.println(contains);

编辑:

所以您的代码如下:

public static int countVowels(String[] ar1) {
    int a = 0;
    String[] ar2 = new String[] { "a", "e", "i", "u", "y", "o" };
    String pattern = ".*[" + String.join("", ar2) + "].*";
    for (int i = 0; i < ar1.length; i++) {
        if (ar1[i].matches(pattern)) {
            a++;
        }
    }
    return a;
}

答案 4 :(得分:0)

您可以使用此:

public static int countVowels(String[] words) {
    char[] chars = {'a', 'e', 'i', 'u', 'y', 'o'};
    int wordsWith3Vowels = 0;
    for (String word : words) {
        int countedVowels = 0;
        for (char s : chars) {
            if (word.toLowerCase().indexOf(s) != -1) {
                countedVowels++;
            }
        }
        if (countedVowels >= 3) {
            wordsWith3Vowels++;
        }
    }
    return wordsWith3Vowels;
}

使用char s而不是String s来加快速度

答案 5 :(得分:0)

public static int countVowels(String[] ar1){  // this method counts 
    //Create hash map key = array string && value = vowels count 
    Map<String,Integer> mapVowels=new HashMap<String,Integer>();
    int a = 0;
    String[] ar2 = new String[]{"a", "e", "i", "u", "y", "o"};
    for(int i = 0; i < ar1.length; i++){
        for(String s : ar2){
            if(ar1[i].toLowerCase().contains(s)){
                //Check map string already has vowel count then increase by one
                if(mapVowels.get(s)!=null) {
                 mapVowels.put(s,mapVowels.get(s)+1);
                 //After add the vowels count get actual count and check is it more than 3
                 if(mapVowels.get(s)>3)
                     a++;
                }
                else {
                    //If the vowels string new for map then add vowel count as 1 for first time
                    mapVowels.put(s,1);
                }
            }
        }
    }
    return a;

}

答案 6 :(得分:0)

java-8开始,您现在可以使用流。

String[] values = {"AA","BC","CD","AE"};

布尔值包含= Arrays.stream(values).anyMatch(“ s” :: equals);

要检查intdoublelong的数组是否包含value,请使用IntStreamDoubleStream或{{1} }。

示例 int [] a = {1,2,3,4}; 布尔包含= IntStream.of(a).anyMatch(x-> x == 4);