Вывод после сортировки?

#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, чтобы онникогда не выходит за рамки?