使用Collection的Java元音计数

时间:2016-12-08 12:49:15

标签: java collections

我被要求编写一个代码来使用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]
*///:~

4 个答案:

答案 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]