Есть ли способ перебрать двумерный ArrayList, а также вызвать методы класса объектов? - PullRequest
0 голосов
/ 04 января 2019

Итак, я пытаюсь перебрать двумерный ArrayList в Java.Теперь я получил часть итерации, однако я не могу вызывать методы из класса объектов.

Я проверил правописание, чтобы убедиться, что метод класса был написан правильно.Это было.Я также попытался выполнить итерацию по 2D ArrayList таким же образом, как можно было бы выполнить итерацию по 2D Array (Nested For-Loops), при этом, очевидно, используя методы ArrayList (.get (), .add () и т. Д.), Чтобы выбрать, какойконкретный объект в двумерном массиве Arraylist, который мне нужен.

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

        for(int j = 0; j < layers.get(i).size(); j++)
        {
            layers.get(i).get(j).calculate(); 
            layers.get(i).get(j).activate();
            input3.add(layers.get(i).get(j).getOutput());
        }  


    }

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

Редактировать / обновить

Следует отметить, что, поскольку эта ошибка возникает из-за ошибки, BlueJ не позволяет мне ее скомпилировать.

Теперь, чтобы понять, что я имею в виду под «2D ArrayList», вот как я его кодировал:

enter code here
//First lets say we have a few different ArrayLists
ArrayList<Object> list1 = new ArrayList<Object>();
ArrayList<Object> list2 = new ArrayList<Object>();
ArrayList<Object> list3 = new ArrayList<Object>();
//Now lets say you want to iterate through all of these with only a few 
//lines of code... Put them into another ArrayList
ArrayList<ArrayList> bigList = new ArrayList<ArrayList>();

Это то, что я имею в виду под 2D ArrayList.Группа ArrayLists внутри другого ArrayList.

Кроме того, методы .Calculate () и .Activate () принимают входные данные от создания объектов, не показанных в представленном мною фрагменте кода.

1 Ответ

0 голосов
/ 04 января 2019

Есть ли способ перебирать ... и также вызывать методы класса объектов?

Да, конечно, есть.

Какой бы объект не былхранится в структуре данных, вы можете вызвать его методы.Проблема, с которой вы сталкиваетесь, имеет два аспекта:

Во-первых, ваши list1, list2, list3, ... объявлены как ArrayList<Object>.Это означает, что, что бы вы ни указали в списках, при извлечении компилятор будет знать только, что это какой-то Object.Следовательно, он позволяет только вызывать методы из Object для этих элементов.Это можно обойти путем явного приведения, например,

MyClass element = (MyClass)(layers.get(i).get(j));
element.calculate();

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

Итак, предполагая, что все элементы, которые вы храните, относятся к одному и тому же типу (MyClass например), чистое решение будет выглядеть следующим образом:

ArrayList<MyClass> list1 = ...;

ArrayList<ArrayList<MyClass>> bigList = ...;

Теперь компилятор будет знать, что внутри bigList есть ArrayList<MyClass> объекты, и из этого он также знает, что внутри элементовиз bigList есть MyClass объектов.Следовательно, он автоматически сделает необходимые преобразования, и вы можете написать bigList.get(i).get(j).methodOfMyClass(...).

Если элементы, которые вы храните во внутренних списках, не имеют общего (супер) типа, то есть их единственный общий супертипнеявно это Object, тогда у вас не будет выбора, кроме как делать соответствующие instanceof проверки и приведения вручную.

Кстати, поскольку ArrayList (косвенно) реализует интерфейс Iterable, выможно просто написать

for ( ArrayList<MyClass> innerList : bigList ) {
  for ( MyClass element : innerList ) {
    element.methodOfMyClass(...);
  }
}

для перебора всех элементов всех списков, содержащихся в bigList.

...