Как проверить, содержит ли массив определенное количество значений? - PullRequest
0 голосов
/ 12 февраля 2019
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 голосов
/ 12 февраля 2019
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;

}

0 голосов
/ 12 февраля 2019

Поскольку java-8 теперь вы можете использовать Streams.

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

логическое содержит = Arrays.stream (значения) .anyMatch ("s" :: равно);

Для проверкинезависимо от того, содержит ли массив int, double или long value, используйте IntStream, DoubleStream или LongStream соответственно.

Пример int [] a = {1,2, 3,4};логическое значение содержит = IntStream.of (a) .anyMatch (x -> x == 4);

0 голосов
/ 12 февраля 2019

Вы можете использовать это:

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 с вместо String с, что немного быстрее

0 голосов
/ 12 февраля 2019

Другое решение с методом 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;
}

Или вы можете использовать matches(), как предложено @pkgajulapalli.Это может быть довольно кратким с потоком API:

long count = Arrays.stream(words)
        .filter(s -> s.toLowerCase().matches("(.*[aeyiuo].*){3,}"))
        .count();
0 голосов
/ 12 февраля 2019

Что вам нужно, это дополнительный цикл и счет.Примерно так:

// 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;
}

Попробуйте онлайн.

Обратите внимание, что вместо переменных я также дал переменным более полезные именаar1, s и т. д., чтобы было легче читать, что происходит.

0 голосов
/ 12 февраля 2019

Вы можете использовать регулярное выражение, чтобы найти, содержит ли строка какой-либо набор символов.Например, если вы хотите узнать, содержит ли строка какой-либо из гласных, вы можете использовать:

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;
}
0 голосов
/ 12 февраля 2019
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;
}

EDIT

Хорошо, теперь я исправил ошибку и отредактировал имена переменных, чтобы сделать их более понятными.хотя это O (n * m), я полагаю (где n - это количество строк, а m - количество символов в самой длинной строке) (не очень хорошая сложность), он выполняет свою работу, ar1 в этом случае - ваш вводстроки, ar2 - это только те гласные, которые существуют.

, поэтому вы просматриваете каждую строку в ar1 и устанавливаете "vowelPerWord" в 0, просматриваете каждый символ в каждой строке и проверяете, является ли это гласным, увеличивайте vowelPerWordна 1. в конце, после того, как вы прошли каждый символ этой строки, вы проверяете, было ли 3 или более гласных, если это так, увеличьте totalWordsWithThreeVowels, который в конце возвращается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...