【问题标题】:Is there a way to iterate through a two dimensional ArrayList and also invoke the class methods of the objects?有没有办法遍历二维 ArrayList 并调用对象的类方法?
【发布时间】:2019-05-30 14:47:39
【问题描述】:

所以我试图在 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() 方法还从我提供的代码 sn-p 中未显示的对象的实例化中获取输入。

【问题讨论】:

  • 什么是“二维”数组列表?你能告诉我们定义吗?
  • 能否添加打印的编译错误以及如何创建数组列表?
  • @Kanjiu 肯定是编译时错误,可能是原始类型的问题。
  • 你是如何声明 ArrayList 的? calculateactivate 期望什么类型? getOutput 返回什么?我们需要更多信息。发Minimal, Complete, and Verifiable example 否则我们帮不了你。
  • Stalemate Of Tuning 我相信我已经做出了必要的调整。

标签: java object arraylist iteration


【解决方案1】:

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

是的,当然有。

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

首先,您的list1list2list3、...被声明为ArrayList&lt;Object&gt;。这意味着,无论您放入列表中的什么,在检索编译器时只会知道它是某种Object。因此它只允许您在这些元素上调用来自Object 的方法。这可以通过显式强制转换来解决,例如

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

但是,更好的选择是首先使用正确的泛型类型。请注意,ArrayList&lt;ArrayList&gt; 使用“原始”类型 ArrayList 作为泛型类型参数,这可能不是您想要的。

因此,假设您存储的元素都是同一类型(例如MyClass),干净的解决方案将是这样的:

ArrayList<MyClass> list1 = ...;

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

现在编译器将知道在bigList 内部有ArrayList&lt;MyClass&gt; 对象,并且由此也知道在bigList 的元素内部有MyClass 对象。因此,它会自动为您执行必要的转换,您可以编写 bigList.get(i).get(j).methodOfMyClass(...)

如果您存储在内部列表中的元素没有通用(超)类型,即它们唯一的通用超类型隐式为Object,那么您将别无选择,只能进行相应的instanceof 检查和手动投射。

顺便说一下,由于ArrayList(间接)实现了Iterable接口,你可以直接写

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

遍历bigList中包含的所有列表的所有元素。

【讨论】:

  • 哦,好吧,我明白了。我现在知道了。非常感谢,因为这让我发疯了。
猜你喜欢
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 2020-10-23
  • 2010-11-20
  • 2021-12-14
  • 1970-01-01
  • 2016-01-16
  • 2016-05-03
相关资源
最近更新 更多