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;