当前位置: 首页 > 知识库问答 >
问题:

我们如何有效地迭代来自同一对象类的对象列表?

公冶泰
2023-03-14

我们有这节课

public class A {

    private String someVariable;
    private List<A> innerObjects;

    /**
    * setters & getters...
    *
    */
}

假设我们不知道InnerObject中有多少个对象,我们如何以最佳方式手动迭代该对象?主要的问题将在内部列表上,因为它可能还有另一个列表,另一个和另一个,等等。。。

共有2个答案

卫飞
2023-03-14

毫无疑问,你不可能比< code>O(n)更有效地迭代一个列表。

因此,您可以创建一个方法来迭代列表并做一些事情(基本上您甚至可以在那里提供一个实现业务逻辑的函数),如果内部A包含一个列表,则递归地再次调用对象上的方法

这种方法的一个简单例子可能是:

String concatenateAllVariables(String current) {
    if(innerObjects != null) { // this and the fact loop won't start when the list will be empty is our "stop condition"
        for(A a: innerObjects) {
            current += a.concatenateAllVariables(""); // this is recursive call
        }
    }
    current += someVariable; // where this line (before or after processing children) shoud be is due to traversal algorithm
    return current;
}

延伸阅读:

    < li >什么是递归 < li>Java将方法作为参数传递 < li >在Java中遍历二叉树的所有节点-因为通常您可以将每个< code>A实例视为某个抽象树节点,并将它的列表视为其子节点(这种结构看起来有点像B树)
程招
2023-03-14

要访问每个嵌套节点,可以执行树遍历。有几种遍历订单可供选择:

  • 深度第一,预购
  • 深度优先,后订购
  • 广度第一
  • ...

以下是一些示例代码,用于深度优先、预排序打印这些字符串中,每个都按树中的深度缩进,以及另一个执行整个对象结构的深度副本的函数:

import java.util.*;

public class A {
    private String someVariable;
    private List<A> innerObjects;

    public A(String text) {
        someVariable = text;
        innerObjects = new ArrayList<A>();
    }

    public A add(String text) {
        return add(new A(text));
    }

    public A add(A object) {
        innerObjects.add(object);
        return object;
    }

    public A deepCopy() {
        A object = new A(someVariable);
        for (A inner : innerObjects) {
            object.add(inner.deepCopy());
        }
        return object;
    }

    public void deepPrint() {
        deepPrint("");
    }
    public void deepPrint(String prefix) {
        System.out.println(prefix + someVariable);
        for (A object : innerObjects) {
            object.deepPrint(prefix + "  ");
        }
    }
}

和一些驱动程序代码来测试这一点:

    public static void main(String[] args) {
        A root = new A("world");
        A europe = root.add("Europe");
        europe.add("Germany");
        europe.add("France");
        A northAmerica = root.add("North America");
        northAmerica.add("United States");
        northAmerica.add("Canada");
        A copy = root.deepCopy();
        copy.deepPrint();
    }
 类似资料:
  • 通过一个简单的数组,我可以使用标准的循环来实现: 但是如何用实物来做呢?

  • 问题内容: 我有一个自定义类对象(下面是示例)。 使用:我想将所有子列表“合并”到一个大列表中。因此,我认为我需要使自定义类成为可迭代的。 这是我的自定义类的示例。 我实现了,但是似乎没有用。他们甚至没有被召集。 知道我做错了什么吗? 注意:使用Python 3.3 问题答案: 当您尝试遍历类实例时调用的是什么: 是在返回的对象上调用的内容(在python2.x上,不是,我一般都对它们都使用别名,

  • 问题内容: 有没有一种方法来获取数组的迭代器?像这样: 问题答案: 您可以使用: 它只是将数组包装在列表实现中,以便您可以在其上调用方法。 请注意,这种方法仅适用于对象数组。对于原始数组,您将必须实现自己的迭代器(例如,使用匿名类)。 从Java 8开始,您还可以使用开箱即用的迭代器(并且如果是或,也可以使此代码进行编译: 尽管您将无法使用原始数据类型,并且因为没有相应的流实现。但是,您可以使用以

  • 问题内容: 假设我们有一个迭代器(一个无限的迭代器)返回列表(或有限迭代器),例如一个由 获得一个迭代器(显然是无限的)是一个好的Python习惯用法,该迭代器将从第一个迭代器返回每个元素,然后从第二个迭代器返回每个元素,依此类推。在上面的示例中它将返回。迭代器是无限的,因此将无法使用。 有关 在python中展平浅表 问题答案: 从Python 2.6开始,您可以使用: 您也可以使用嵌套的生成器

  • 下面是带有复制构造函数和初始化列表构造函数的CL结构。我认为这里只能调用复制构造函数,因为根据C++14标准,8.5.4/3 null 谁是对的?谁的行为是正确的?

  • 假设数据采集对象如下所示 我需要尝试使用java lambda函数在引擎匹配时获取匹配的品牌对象。 现在,如果发动机类型匹配,我需要获得品牌名称。例如,如果搜索引擎1,则需要返回Honda对象。 下面是代码示例:类Vehicle: 类别品牌: 类车: 类引擎: 班级主修: 以上是我尝试的代码。之前,我的目标是使用授权子对象列表中的关键字进行过滤。 现在,我使用它作为一个键,以父对象或品牌对象作为值