Храните несколько типов данных одного и того же родителя в списке массивов

#java #object #arraylist

Вопрос:

У меня есть класс А, который является родительским классом. Тогда у меня есть неизвестный набор классов (назовем их B, C, D и т.д.), Которые являются дочерними классами A. В качестве общей переменной все объекты A имеют переменную int, определяемую в качестве параметра. В другом классе мне нужно написать код, который обращается к экземплярам B, C, D и т. Д. которые указаны Пользователем. Код манипулирует, считывает и иным образом работает с этими объектами, чтобы позже отобразить их в таблице J. Я начал с определения списка массивов в области:

 ArrayList<A> theArrayList = new ArrayList<>();
int wealth = (some code that defines the int);
 

позже я запускаю следующий код в конструкторе:

 while (this.theArrayList.size() == 0) {
  int i = 0;
  while (this.theArrayList.toArray().length > i) {
       for (A a : this.theArrayList) {
          if (a.price > this.wealth) {
              this.anArrayListOfAFromPreviousCodeBlock.add(a);
          }

          int randomIndex = (int) (Math.random() * 
              this.anArrayListOfAFromPreviousCodeBlock.toArray().length);
          if (this.anArrayListOfAFromPreviousCodeBlock.size() == 0) {
                JOptionPane.showMessageDialog(null, "Array length is 0!");
          }
         //Error source
         this.thisArrayList.add(this.anArrayListOfAFromPreviousCodeBlock.get(randomIndex)); 
     }
   i  ;
}
 

оба блока, как ArrayList, так и anArrayListOfAFromPreviousCodeBlock, определены в одном и том же формате:

 //in the scope of the class:
ArrayList<A> theArrayList;
ArrayList<A> anArrayListOfAFromPreviousCodeBlock;

//later in the constructor: 
this.theArrayList = new ArrayList<>();
this.anArrayListOfAFromPreviousCodeBlock = new ArrayList<>();
 

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я запускаю этот код, я получаю «Исключение IndexOutOfBoundsException: Индекс 0, размер 0» в отмеченной строке.
Если я правильно это интерпретирую, этот.этот список всегда имеет размер 0. Я инициализирую его, но он все равно остается пустым. Я добавил условие в первую строку второго блока кода, но это приводит к бесконечному циклу, а не к решению. Поскольку речь идет о случайной случайности, я думал, что мне не повезло, и список просто всегда был пуст.
Но поскольку он вообще не может быть заполнен, невозможно, я обнаружил, что это может быть связано с несовместимыми типами данных в списке массивов. Поскольку я создал код для работы с As, а не с детьми A, может возникнуть проблема.
Я не уверен, как дальше подойти к этой проблеме. Каким-то образом мне нужно сохранить неизвестное количество объектов неизвестного числа типов данных в списке массивов. Я бы использовал обычный массив, но список массивов неизвестен и, возможно, изменяется по размеру.
Но мне все еще нужно, чтобы он отображал данные в J-таблице позже.

В соответствии с просьбой позвольте мне объяснить, что должен делать код: как я уже сказал, у меня есть несколько подклассов от A. И программа создает неизвестное количество объектов этих подклассов. Цель этого блока кода состоит в том, чтобы проверить каждое значение A и взять его цену, чтобы проверить, больше ли оно этого.богатство. Объект, на котором я использую этот метод, имеет богатство, и богатство-это int, определенный выше. Если это будет сделано, объект будет добавлен в список массивов в строке 6 приведенного выше кода. Затем я делаю что-то еще с элементами в этом массиве в случайном порядке, чтобы избежать смещения. Вот почему я беру случайный индекс. По соображениям безопасности и чтобы не потерять данные при повторении этого цикла, я добавляю все выбранные элементы в новый список массивов. Этот список массивов, как только код будет полностью завершен, будет отображаться с помощью JTable.

Комментарии:

1. Проверьте размер anArrayListOfAFromPreviousCodeBlock . Если вы используете ide, используйте известный инструмент под названием Debugger.

2. Разве я не сделал это с помощью цикла while? Я проверил это несколько раз в разных условиях. Если цикл реализован, он будет выполняться непрерывно. если нет, я получу сообщение об ошибке.

3. Внешний цикл выполняется, если theArrayList.size == 0 . Внутренний цикл выполняется, если theArrayList.size > i (размер уже установлен как 0 и i инициализирован как 0, поэтому циклы немедленно заканчиваются). Это никогда ничего не должно делать… Сообщение об исключении ясно — вы пытаетесь получить доступ к элементу 0 в пустом списке (т. Е. Элементов нет, поэтому в 0 ничего нет). Я не уверен, чего вы пытаетесь достичь с помощью этих циклов — можете ли вы объяснить на естественном языке или псевдокодировать, что пытается сделать этот блок? Так thisArrayList и должно быть theArrayList ?

4. Я добавил абзац, объясняющий, что делает код.

5. @GalliadII насколько я понимаю ваш код, вы не проверяете размер anArrayListOfAFromPreviousCodeBloc, что бы это ни было… Метод get вызывается извне из предыдущего условия if.