有没有一种方法可以遍历二维ArrayList并调用对象的类方法?

时间:2019-01-04 01:21:55

标签: java object arraylist iteration

因此,我尝试遍历Java中的二维ArrayList。现在,我已经把迭代部分简化了,但是,我似乎无法从对象类中调用方法。

我已经检查了我的拼写,以确保正确地拼写了类方法。它是。我还尝试了以一种遍历2D Array(嵌套循环)的相同方式遍历2D ArrayList,同时显然使用ArrayList方法(.get()、. add()等)来选择我需要的2D 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的意思。另一个ArrayList中的一组ArrayList。

.Calculate()和.Activate()方法还从我所呈现的代码片段中未显示的对象实例化中获取输入。

1 个答案:

答案 0 :(得分:2)

  

是否有一种方法可以遍历...并且还可以调用该类   对象的方法?

是的,当然有。

无论对象存储在数据结构中如何,都可以调用其方法。您面临的问题有两个方面:

首先,将您的list1list2list3,...声明为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,那么您别无选择,只能执行相应的{{1 }}进行手动检查和投射。

顺便说一下,由于instanceof(间接地)实现了ArrayList接口,因此您可以编写

Iterable

遍历for ( ArrayList<MyClass> innerList : bigList ) { for ( MyClass element : innerList ) { element.methodOfMyClass(...); } } 中包含的所有列表的所有元素。