首页 > 解决方案 > 有没有办法遍历二维 ArrayList 并调用对象的类方法?

问题描述

所以我试图遍历Java中的二维ArrayList。现在我已经完成了迭代部分,但是,我似乎无法从对象类中调用方法。

我检查了我的拼写以确保类方法拼写正确。它是。我还尝试以与遍历 2D 数组(嵌套 For-Loops)相同的方式遍历 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() 方法也从我提供的代码片段中未显示的对象的实例化中获取输入。

标签: javaobjectarraylistiteration

解决方案


有没有办法遍历......并调用对象的类方法?

是的,当然有。

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

首先,您的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 = ...;

现在编译器会知道里面bigListArrayList<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


推荐阅读