我被要求编写一个代码来使用Sets计算和显示字符串中的元音。有关为什么下面的代码给出错误输出的任何建议?切换似乎是显而易见的方法,我也尝试过if-statemen,但都没有正常工作。
import java.util.*;
class Vowels {
String s;
Set<String> set = new HashSet<String>();
Vowels(String s, LinkedHashSet<String> set) {
this.s = s;
this.set = set;
}
public void evaluator() {
Collections.addAll(set, s.split(""));
int vn = 0;
String vowel = "";
List<String> vowels = new ArrayList<String>();
Iterator<String> it = set.iterator();
while(it.hasNext()) {
switch(it.next()) {
case "a":
case "e":
case "i":
case "o":
case "u":
case "y":
case "w":
vn++;
vowel = it.next();
vowels.add(vowel);
}
}
System.out.println("Number of vowels is " + vn);
System.out.println("Vowels are " + vowels);
}
}
public class ExXVI {
public static void main(String[] args) {
LinkedHashSet<String> set1 = new LinkedHashSet<String>();
Vowels q = new Vowels("Some words have vowels, some do not", set1);
q.evaluator();
}
} /* Output:
Number of vowels is 4
Vowels are [m, , r, v]
*///:~
答案 0 :(得分:2)
您遗漏某些元音的原因是您使用的Set
不允许重复输入。除此之外,您还会调用两次it.next()
,从而丢失之前的条目。我删除Sets
但仍使用您的概念,稍微修改了您的代码。
class Vowels {
String s;
Vowels(String s) {
this.s = s;
}
public void evaluator() {
int vn = 0;
String vowel = "";
List<String> vowels = new ArrayList<>();
List<String> vowelsList = Arrays.asList(s.split(""));
Iterator<String> it = vowelsList.iterator();
while (it.hasNext()) {
vowel = it.next();
switch (vowel) {
case "a":
case "e":
case "i":
case "o":
case "u":
case "y":
case "w":
vn++;
vowels.add(vowel);
}
}
System.out.println("Number of vowels is " + vn);
System.out.println("Vowels are " + vowels);
}
}
public class ExXVI {
public static void main(String[] args) {
Vowels q = new Vowels("Some words have vowels, some do not");
q.evaluator();
}
}
将打印以下内容:
Number of vowels is 13
Vowels are [o, e, w, o, a, e, o, w, e, o, e, o, o]
答案 1 :(得分:1)
如果您使用的是Java 8,则可以使用流:
int numberOfVowels = input.toLowerCase().chars().mapToObj(i -> (char) i)
.filter(c -> "aeiouy".contains(String.valueOf(c)))
.count();
但是存在语义问题; 'y' is sometimes a vowel and sometimes a consonant,取决于它出现的单词。
答案 2 :(得分:0)
我很确定这部分是因为你把'Y'和'W'算作元音。此外,当您去保存元音时,再次调用it.next()。这实际上获取了集合中的下一个对象,而不是您刚刚在交换机中进行比较的对象。您应该在切换之前保存it.next()的值,然后使用该变量以便稍后引用它。
答案 3 :(得分:0)
根据wiki page,英语中的元音是[A,E,I,O,U],有时是Y.
我已修复您的解决方案:
class Vowels {
String s;
List<String> list;
Vowels(String s, List<String> list) {
this.s = s;
this.list = list;
}
public void evaluator() {
Collections.addAll(list, s.split(""));
int vn = 0;
String vowel;
List<String> vowels = new ArrayList<String>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
vowel = it.next();
System.out.println("Vowel is: " + vowel);
switch(vowel) {
case "a":
case "e":
case "i":
case "o":
case "u":
case "y":
vn++;
vowels.add(vowel);
}
}
System.out.println("Number of vowels is " + vn);
System.out.println("Vowels are " + vowels);
}
}
class ExXVI {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
Vowels q = new Vowels("Some words have vowels, some do not", list);
q.evaluator();
}
}
实际回复:
Number of vowels is 11
Vowels are [o, e, o, a, e, o, e, o, e, o, o]
请注意Set
不允许重复输入,因此拆分字符串的结果应存储在List
中。此外,在您的代码中,两次调用it.next()
会导致您的程序跳过对某些元音的计数,因为next()
通过向右移动到Collection
来更改当前元素。
Set
非常有用,因此您可能需要使用:
Set<String> vowels = new HashSet<String>();
导致
Number of vowels is 11
Vowels are [a, e, o]