#java
#java
Вопрос:
Я работаю над созданием программы, которая принимает фразу от пользователя, а затем подсчитывает гласные, а затем отображает все гласные в отсортированном порядке возрастания в соответствии с их количеством.
Пример того, как это должно выглядеть:
Welcome to the vowel counter and sorter!
Enter a phrase!
aaaaaeeeeiiioou
The vowels and their count:
u 1
o 2
i 3
e 4
a 5
Я думаю, что мой код в порядке, за исключением того, что я действительно не знаю, что делать после «гласные и их количество: после того, как я отсортировал как гласные, так и количество
int[] vCount = new int[5];
System.out.println("Welcome to the vowel counter and sorter!nEnter a phrase!");
String input = keyboard.nextLine();
String upInput = input.toUpperCase();
//examine all characters
for (int i=0; i<upInput.length(); i )
{
switch (upInput.charAt(i))
{
case 'A':
vCount[0] ;
break;
case 'E':
vCount[1] ;
break;
case 'I':
vCount[2] ;
break;
case 'O':
vCount[3] ;
break;
case 'U':
vCount[4] ;
break;
}
}
char[] vArray = {'A', 'E', 'I', 'O', 'U'};
//Bubble Sort
boolean hasSwapped = true;
while (hasSwapped == true)
{
hasSwapped = false; //Assumes it is sorted
for (int i = 0; i<vCount.length-1; i )
{
if (vCount[i] > vCount[i 1])
{
int temp = vCount[i];
vCount[i] = vCount[i 1];
vCount[i 1] = temp;
hasSwapped = true;
char temp2 = vArray[i];
vArray[i] = vArray[i 1];
vCount[i 1] = temp2;
}
}
}
System.out.println("The vowels and their count:");
for (int i=0; i<vArray.length; i )
{
System.out.println(vArray[i] " " vCount[i]);
}
}
Мой вывод совершенно неправильный и запутанный. Я предполагаю, что вам нужен цикл for для печати массива, но мой вывод далек:
Enter a phrase!
aaaaaeeeeiiioou
The vowels and their count:
U 1
U 79
U 79
U 79
U 79
Пожалуйста, помогите мне правильно распечатать это?
Ответ №1:
Смотрите мой комментарий в коде для вашей сортировки:
if (vCount[i] > vCount[i 1])
{
int temp = vCount[i];
vCount[i] = vCount[i 1];
vCount[i 1] = temp;
hasSwapped = true;
char temp2 = vArray[i];
vArray[i] = vArray[i 1];
vCount[i 1] = temp2; // this line is wrong. reference vArray not vCount
}
В качестве примечания, подобные проблемы — вот почему вы никогда не должны переписывать сортировку самостоятельно. Для этого есть библиотеки. Было бы намного чище реализовать это, используя сопоставление char с int и просто выводить результаты на основе наибольшего количества. Однако приведенное ниже должно решить вашу непосредственную проблему:
if (vCount[i] > vCount[i 1])
{
int temp = vCount[i];
vCount[i] = vCount[i 1];
vCount[i 1] = temp;
hasSwapped = true;
char temp2 = vArray[i];
vArray[i] = vArray[i 1];
vArray[i 1] = temp2;
}
Комментарии:
1. Вау, так просто, я удивлен, что не заметил этого! Спасибо, nhouser, мы только начали изучать массивы, и одно из упражнений, которое мой профессор пытается заставить нас изучить, — это сортировка массивов с использованием «пузырьковой сортировки», и это мой первый урок программирования, поэтому я ничего не знаю о картах и библиотеках!
2. @ChrisM Нет проблем, рад помочь. Пожалуйста, проголосуйте и примите!
3. Проголосует и примет 🙂 Кстати, я использовал пример моего профессора для блока кода сортировки, можете ли вы сказать мне, почему это vCount . длина -1 для строки: for (int i = 0; i длина-1; i ) Я не понимаю минус одну часть.
4. @ChrisM Это было бы потому, что вы индексируете в
vCount[i 1]
. Поскольку вы смотрите на индексi 1
, вы не можете перейти к полной длине, иначе вы попытались бы посмотретьmaxlength 1
, что будет индексом вне массива. Дайте мне знать, если это не имеет смысла, и я могу объяснить по-другому5. Я думаю, это имеет смысл. Поскольку массив достигает максимума в 5, и вы сравниваете с vCount [i 1], когда он в конечном итоге достигает vCount 5, он не может выполнить vCount [5 1], потому что это будет 6, который находится за пределами индекса, поэтому вам нужно сравнить его с одним меньше max, чтобы онникогда не выходит за рамки?