因此,我尝试遍历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()方法还从我所呈现的代码片段中未显示的对象实例化中获取输入。
答案 0 :(得分:2)
是否有一种方法可以遍历...并且还可以调用该类 对象的方法?
是的,当然有。
无论对象存储在数据结构中如何,都可以调用其方法。您面临的问题有两个方面:
首先,将您的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
,那么您别无选择,只能执行相应的{{1 }}进行手动检查和投射。
顺便说一下,由于instanceof
(间接地)实现了ArrayList
接口,因此您可以编写
Iterable
遍历for ( ArrayList<MyClass> innerList : bigList ) {
for ( MyClass element : innerList ) {
element.methodOfMyClass(...);
}
}
中包含的所有列表的所有元素。