проблема с реализацией сортировки с подсчетом для строк - PullRequest
1 голос
/ 02 августа 2020

Я получаю эту ошибку, когда пытаюсь отсортировать ее по второму символу в строке, но она работает нормально, когда я использую первый символ

Исключение в потоке "main" java .lang.ArrayIndexOutOfBoundsException : Индекс -1 за пределами длины 8 в StringCountSort.countingSort (StringCountSort. java: 27) в StringCountSort.main (StringCountSort. java: 38)

import java.util.Arrays;

public class StringCountSort{
    
    public static void countingSort(String[] array, int size, int digit)
    {

        String[] result = new String[size+1];
        
        int maximum = 122;
        
        int[] count = new int[maximum + 1];
        for (int i = 0; i < count.length; i++){
            count[i] = 0;
        }
        
        for (int i = 0; i < size; i++){
            count[array[i].charAt(digit)] +=1;
        }
        
        for (int i = 1; i < count.length; i++){
            count[i] += count[i-1];
        }
    
        for (int i = size -1; i >= 0; i--){

            result[count[array[i].charAt(digit)] - 1] = array[i];
            count[array[i].charAt(0)]--;
        }

        for (int i = 0; i < size; i++) {
            array[i] = result[i];
        }
    }
    
    public static void main(String args[]){
        String[] data = { "eg", "fa", "bz", "ch", "hv", "df", "ag" };
        StringCountSort.countingSort(data, data.length, 1);
        System.out.println("Sorted Array in Ascending Order: ");
        System.out.println(Arrays.toString(data));
        
        
        
    }
}

line 28 result[count[array[i].charAt(digit)] - 1] = array[i]; 

line 37 StringCountSort.countingSort(data, data.length, 1); 

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Измените

count[array[i].charAt(0)]--;

на

count[array[i].charAt(digit)]--;

Это должно помочь.

Я также предлагаю следующие улучшения:

  1. Вам не нужно передавать длину array в качестве аргумента.
  2. Вам не нужно устанавливать каждые int из count на 0;
  3. maximum должно быть Character.MAX_VALUE, чтобы поддерживать все возможные символы.

Готовая функция может выглядеть так:

    public static void countingSort(String[] array, int digit) {
        String[] result = new String[array.length];
        int[] count = new int[Character.MAX_VALUE + 1];

        for (int i = 0; i < array.length; i++){
            count[array[i].charAt(digit)]++;
        }
        for (int i = 1; i < count.length; i++){
            count[i] += count[i-1];
        }
        for (int i = array.length -1; i >= 0; i--){
            result[count[array[i].charAt(digit)] - 1] = array[i];
            count[array[i].charAt(digit)]--;
        }
        for (int i = 0; i < array.length; i++) {
            array[i] = result[i];
        }
    }
0 голосов
/ 02 августа 2020

Что нужно изменить (если вы хотите отсортировать строки по первому символу)

  1. count[array[i].charAt(digit)] +=1 на count[array[i].charAt(0)] +=1
  2. result[count[array[i].charAt(digit)] - 1] = array[i]; count[array[i].charAt(0)]--; на result[--count[array[i].charAt(0)]] = array[i];

Если вы хотите отсортировать строку на основе второго символа, просто измените:

  1. count[array[i].charAt(0)]--; на count[array[i].charAt(digit)]--;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...