Я пытаюсь создать алгоритм 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.
@ggorlen Я пробовал это раньше, но все равно получаю ту же ошибку, хотя я бы добавил int в правильный массив Arraylist? В сообщении об ошибке говорится: «Тип выражения должен быть типом массива, но он разрешен как ArrayList <ArrayList <Integer>>».
В вашем объявлении он никогда не войдет в цикл for. digits не имеет элементов, поэтому .size() будет 0.
Вы можете объяснить свою цель на примере
@ Ивар Хороший улов. «Base» установит емкость, но размер все равно будет 0. Я заменил digits.size () на 10, но все равно ошибка.
@NisargPatil в основном то, что я пытаюсь сделать, например, у меня есть [[10, 20], [21, 11] ..., [79]]. Вот как будет выглядеть список массивов, когда я сортирую числа по их месту. Скажем, я нахожу во входном массиве еще одно целое число «29». Затем я хотел бы добавить это в самый последний список массивов, но я не могу этого сделать. Bc Я пытаюсь добавить int в ArrayList <Integer>




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
почему index-1? это создает еще одно исключение вне пределов. У меня было такое же утверждение раньше, когда я пытался отладить только индекс, но все равно это было безуспешно
Это может выдавать вам indexOutOfBoundException, потому что ваш digits не инициализирован должным образом.
for(int i=0 ; i<10 ; i++) { digits.add(new ArrayList<>()); } Используйте это для инициализации цифр
Да, я уже исправил, что bc кто-то указал на это в комментариях выше
Вы, вероятно, захотите что-то вроде
digits[k].add(idx, number); другими словами, «добавить номер в список с индексомkв списке цифр».