Невозможно добавить int в ArrayList из ArrayLists

Я пытаюсь создать алгоритм Radix Sort, и у меня есть список массивов списков массивов.

Radix Sort добавляет элементы к «внешнему» списку массива в зависимости от значения разряда числа в единицах, десятках, сотнях и т. д. Каждый "внутренний" список массивов соответствует разряду цифр 0, 1, 2, 3 ... 9.

Значение переменной base - 10, так как здесь 10 цифр (0–9).

Вот декларация:

    ArrayList<ArrayList<Integer>> digits = new ArrayList<ArrayList<Integer>>(base); //arraylist that can hold 10 elements to sort elements according to digits 0-9

    for(int i=0; i <digits.size(); i++){

        digits.add(i, new ArrayList<Integer>()); //make an arraylist for each element inside the digits array list, this will hold the numbers that are being sorted
    }

Однако позже, когда я пытаюсь добавить целые числа в правильный «внутренний» список массивов, я не могу этого сделать, поскольку пытаюсь добавить целое число в место типа ArrayList. Я также получаю сообщение об ошибке "вне границы".

while(!(lastDigit)) //if last digit has not been reached
    {
        lastDigit = true;

        for(int k=0; k < array.length; k++) //array contains the numbers we are sorting
        {
            number = k / digitPlace; //digitPlace starts off as 1 to first sort by one's place and is then later multiplied by 10 
            int index = number % base; //get digit from correct place

             digits.add(index, k);//line with the ERROR; add the element in the correct place (according to it's digit)

            if (number > 0 && lastDigit) 
            {
                lastDigit = false;
            }

        }

Способ решения проблемы состоит в том, что я привел целое число к типу ArrayList, но это означало бы, что я бы добавил список массивов во внутренний список массивов, а это не то, что я хочу. Я хочу добавить int в правильный «внутренний» ArrayList.

Вы, вероятно, захотите что-то вроде digits[k].add(idx, number); другими словами, «добавить номер в список с индексом k в списке цифр».

ggorlen 30.06.2018 20:50

@ggorlen Я пробовал это раньше, но все равно получаю ту же ошибку, хотя я бы добавил int в правильный массив Arraylist? В сообщении об ошибке говорится: «Тип выражения должен быть типом массива, но он разрешен как ArrayList <ArrayList <Integer>>».

Shania 30.06.2018 20:53

В вашем объявлении он никогда не войдет в цикл for. digits не имеет элементов, поэтому .size() будет 0.

Ivar 30.06.2018 20:56

Вы можете объяснить свою цель на примере

Nisarg Patil 30.06.2018 20:59

@ Ивар Хороший улов. «Base» установит емкость, но размер все равно будет 0. Я заменил digits.size () на 10, но все равно ошибка.

Shania 30.06.2018 21:00

@NisargPatil в основном то, что я пытаюсь сделать, например, у меня есть [[10, 20], [21, 11] ..., [79]]. Вот как будет выглядеть список массивов, когда я сортирую числа по их месту. Скажем, я нахожу во входном массиве еще одно целое число «29». Затем я хотел бы добавить это в самый последний список массивов, но я не могу этого сделать. Bc Я пытаюсь добавить int в ArrayList <Integer>

Shania 30.06.2018 21:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
146
2

Ответы 2

JavaDoc размера ():

Returns the number of elements in this list. (...)

ArrayList<ArrayList<Integer>> digits = new ArrayList<ArrayList<Integer>>(base);
for(int i=0; i < digits.size(); i++){
    digits.add(i, new ArrayList<Integer>());
}

Вы ссылаетесь на размер списка в цикле for вместо вместимость!

Используйте переменные база, используемые для создания списка, вместо digits.size ()

digits.get(index).add(n);
где n - номер из входного массива, который нужно добавить.

вам может потребоваться включить в него логику lastDigit

Nisarg Patil 30.06.2018 21:17

почему index-1? это создает еще одно исключение вне пределов. У меня было такое же утверждение раньше, когда я пытался отладить только индекс, но все равно это было безуспешно

Shania 30.06.2018 21:24

Это может выдавать вам indexOutOfBoundException, потому что ваш digits не инициализирован должным образом.

Nisarg Patil 30.06.2018 21:28
for(int i=0 ; i<10 ; i++) { digits.add(new ArrayList<>()); } Используйте это для инициализации цифр
Nisarg Patil 30.06.2018 21:35

Да, я уже исправил, что bc кто-то указал на это в комментариях выше

Shania 01.07.2018 18:22

Другие вопросы по теме

Как разбить массив на 26 различных строковых значений, которые отображаются на веб-странице как 1 строка?
JS: перенаправить на сайт со случайными частями в URL
Доступ к индексам элемента jquery 2D-массива из внутренней функции обратного вызова
Как преобразовать байты массива в изображение?
Одно значение эха PHP из массива, возвращаемого запросом к базе данных mysql
Пожалуйста, я пытаюсь объединить строковый результат с переменной в экспресс-маршрутизаторе, но он возвращает пустую строку
Количество элементов внутренних массивов многомерного массива в C
ForEach, похоже, работает для функции push (), но не работает для pop () в JavaScript. может кто-нибудь сказать мне, что я делаю не так
С ++ недопустимый указатель / двойное освобождение класса с членом массива
Можем ли мы преобразовать массив карты в массив класса сущности модели [POJO] без цикла?