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个。
答案 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;
}
请注意,我还为变量赋予了一些更有用的名称,而不是ar1
,s
等,因此更容易阅读正在发生的事情。
答案 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);
要检查int
,double
或long
的数组是否包含value
,请使用IntStream
,DoubleStream
或{{1} }。
示例 int [] a = {1,2,3,4}; 布尔包含= IntStream.of(a).anyMatch(x-> x == 4);