Java 按元音数对数据文件进行排序

Java 按元音数对数据文件进行排序,java,Java,通过比较每个单词包含的元音数量对所有单词进行排序。这个 元音数最少的单词将排在第一位。如果有多个单词的元音数相同,则该组将按字母顺序排序 我相信我已经完成了大部分项目,我只是不知道为什么它不起作用 public class Word implements Comparable<Word> { private String word; public Word(String s) { word = s; } private int nu

通过比较每个单词包含的元音数量对所有单词进行排序。这个 元音数最少的单词将排在第一位。如果有多个单词的元音数相同,则该组将按字母顺序排序

我相信我已经完成了大部分项目,我只是不知道为什么它不起作用

public class Word implements Comparable<Word> {
    private String word;

    public Word(String s) {
        word = s;
    }

    private int numVowels() {
        String vowels = "AEIOUaeiou";
        int vowelCount = 0;

        for (int i = 0; i < vowels.length(); i++) {
            if ((vowels.charAt(i) == 'a') || (vowels.charAt(i) == 'e') || (vowels.charAt(i) == 'i') || (vowels.charAt(i) == 'o') || (vowels.charAt(i) == 'u')) {
                return vowelCount;
            }
        }
        return vowelCount;
    }

    public int compareTo(Word rhs) {
        for (int i = 0; i < word.length(); i++) {
            if ((word.charAt(i) == 'a') || (word.charAt(i) == 'A')) {
                System.out.println(word);
            } else if ((word.charAt(i + 1) == 'e') || (word.charAt(i + 1) == 'E')) {
                System.out.println(word);
            }
        }

        return -1;
    }

    public String toString() {
        return word;
    }
}
公共类Word实现了可比较的{
私有字符串字;
公共字(字符串s){
word=s;
}
私有int numVowels(){
字符串元音=“AEIOUaeiou”;
int-vouelcount=0;
for(int i=0;i<元音.length();i++){
if((元音.charAt(i)='a')|(元音.charAt(i)='e')|(元音.charAt(i)='i')|(元音.charAt(i)='o')|(元音.charAt(i)='u')){
返回元音计数;
}
}
返回元音计数;
}
公共整数比较(Word rhs){
for(int i=0;i

我认为我的错误在于
方法的比较。我不确定。有人能帮我吗?

首先,尽量不要把作业贴在这里。您的
numowels()
方法也错误

private int numVowels() //FIXED METHOD
{
    String vowels = "AEIOUaeiou";
    int vowelCount = 0;

    for(int i = 0; i < vowels.length(); i++)
    {
        if((vowels.charAt(i) == 'a') || (vowels.charAt(i) == 'e')  || (vowels.charAt(i) == 'i') || (vowels.charAt(i) == 'o') || (vowels.charAt(i) == 'u') || (vowels.charAt(i) == 'A') || (vowels.charAt(i) == 'E') || (vowels.charAt(i) == 'I') || (vowels.charAt(i) == 'O') || (vowels.charAt(i) == 'U'))      
        {
            return vowelCount; //Will return lowercase AND capital vowels :)
        }
    }
    return vowelCount;
}
private int numowels()//固定方法
{
字符串元音=“AEIOUaeiou”;
int-vouelcount=0;
for(int i=0;i<元音.length();i++)
{
若(元音.charAt(i)以及(元音.charAt(i)以及(元音)若(元音)若(i)若(元音.charAt(i)若(元音.charAt(i)若(元音.charAt(i)若(元音.charAt(i)i)若(元音.charAt(i)若)若(i)若(i)若(i)若)若(元音.charAt(i)若(i)若(i)i=“我)以及以及“我本人本人本人本人本人本人本人本人本人本人本人)以及以及以及(i)方)\124()()()()()()()()()()()())))))));(元元音.charAt(i.charAt(i.charAt(i)若(i)若(i)若(i)若)若若若若)若若若若(i)以及以及以及(i=“o方方方方方方方方)以及以及以及)("u")
{
return vouelCount;//将返回小写和大写元音:)
}
}
返回元音计数;
}
您的原始代码只搜索小写字母“a”、“e”、“i”、“o”和“u”。我在您的if语句中添加了大写字母(“A”、“E”等)

在返回元音计数时,您之前正在返回0。当您找到元音时,您需要增加元音计数,然后在完成循环后返回元音计数。您还需要检查大写元音,而不仅仅是小写元音,以获得准确的计数


您的compareTo方法甚至不接近正确…

首先-我没有意识到
Word
是您的自定义类。也就是说…它有很多缺点

您的
compareTo
方法实际上非常有效,只需将两个字符串一起进行比较。您要做的是这样的:

public int compareTo(Word other) {
    return word.compareTo(other.getWord());
}
原因是

现在,如果这不是你想要的(我真的不确定这到底是什么),那么你可以比较两个
Word
实例的元音数量

public int compareTo(Word other) {
    return word.numVowels() - other.numVowels();
}
如果当前
单词
的元音比所比较的
单词
的元音多,则上面将返回正值;如果元音较少,则返回负值;如果元音相等,则返回零

接下来,您的
numowels()
方法被完全破坏。看看你在重复什么:
元音
元音
字符串始终是一个常量值。它永远都不会改变——正好有十个元音,五个小写字母和五个大写字母

您要做的是对照元音集检查
单词
字段

这里有一个更好的*解决方案:使用一个
集合
——您可以为它们获得恒定的查找时间

Set<Character> vowelSet = new HashSet<Character>() {{
        add('a');
        add('A');
        add('e');
        add('E');
        add('i');
        add('I');
        add('o');
        add('O');
        add('u');
        add('U');
}};

*它没有考虑到Y有时是元音。

我不完全确定应该发生什么?我修正了一种方法,但是我不知道第二种方法,对不起。也许其他人知道:)在这里张贴家庭作业问题没有什么错。第二,您的方法是无用的,因为对于一组固定的数据,您将始终返回零。@Makoto如何解决这个问题?您可以参考我发布的答案以获得解决方案。代码可以工作,但我们应该使用collection以获得更好的性能。。同意@Makoto你回来得太快了。你想先数一数元音,然后返回。谢谢你抓住了这一点,这是我在原始帖子中的观点,我只是错过了从实际代码中删除返回。我很高兴你这么做。现在,你对上一个答案有同样的问题:你只会比较十个元音,所以你只会数到十。我不同意你的观点,如果你有一个单词,它会在单词中循环并返回该单词中元音的数量。每次在循环中,它都会检查这个字符并确定它是否是元音。如果是,则元音数增加。你能给我解释一下为什么你说它只能数到十吗?@Makoto我该怎么实现它?啊哈!这是有道理的。谢谢你的澄清。
Set<Character> vowelSet = new HashSet<Character>() {{
        add('a');
        add('A');
        add('e');
        add('E');
        add('i');
        add('I');
        add('o');
        add('O');
        add('u');
        add('U');
}};
int count = 0;
for(char c : word.toCharArray()) {
    if(vowelSet.contains(c)) {
        count++;
    }
}
return count;