java - 如何处理toString Java方法中的递归?

标签 java recursion tostring

我的程序结构如下:一个类代表一个原子概念,它本质上是一个字符串,另一个类由一般概念列表组成。这两个类都扩展了抽象类 Concept 类,这意味着在列表中我可以同时具有原子概念和任意嵌套的概念交集。 每个概念,无论是原子的还是组合的,都由 toString 方法打印出来。 粗略地说,这是基于上下文无关语法的:

C : atom | (C and)+ C

其中C是抽象类Concept,atom是AtomicConcept,(C and)+ C是Intersection。

这是 AtomicConcept 类:

public class AtomicConcept extends Concept{

private String atomicConceptName;

public AtomicConcept(String c) {
    this.atomicConceptName = c;
}

@Override
public String toString() {
    return atomicConceptName;
   }

}

这是 ConceptIntersection 类:

import java.util.List;

public class ConceptIntersection extends Concept{

private List<Concept> list;

public ConceptIntersection(List<Concept> l) throws Exception {
    if(l.size()>1)
    {
        this.list = l;
    }
    else
    {
        throw new Exception("Intersection needs at least two concepts!");
    }
   }

public String toString()
{
    return Utils.conceptIntersection + Utils.lparen + Utils.splitConcepts(list) + Utils.rparen;

}

}

正如您在 toString 函数中所看到的,我还创建了一个名为 splitConcepts 的方法,该方法接受输入的一般概念列表,并返回由逗号分隔的每个概念组成的字符串。

public static String splitConcepts(List<Concept> list)
{
    String result = "";
    for (Concept item : list) {
        System.out.println(item);
        result += item.toString() + comma;

    }
    result = result.substring(0, result.length() - 1);
    return result;
}

问题出在哪里? 我在使用这个函数时遇到了麻烦,因为当我在另一个函数中调用嵌套交集时,这个函数永远不会结束!

一个例子:

public static void main(String[] args) throws DLRException {
    // TODO Auto-generated method stub

    AtomicConcept atom = new AtomicConcept("one");
    AtomicConcept at = new AtomicConcept("two");
    List<Concept> list = new LinkedList<Concept>();
    list.add(at);
    list.add(atom);
    DLRConceptIntersection intersection = new DLRConceptIntersection(list);
    System.out.println(intersection); // works fine
    list.add(intersection);
    DLRConceptIntersection intersection2 = new DLRConceptIntersection(list);
    System.out.println(intersection2); //loop never ends!
}

解决此问题的正确方法是吗?

最佳答案

您有一个循环引用:

DLRConceptIntersection intersection = new DLRConceptIntersection(list);
list.add(intersection);

这会导致 intersection 的列表包含对 intersection 引用的同一实例的引用,这就是 toString() 运行的原因进入无限递归。

我假设您不打算让 intersectionintersection2 共享相同的List

如果您在 DLLRConceptIntersection 构造函数中创建 List 的副本,则可以避免这种情况:

public ConceptIntersection(List<Concept> l) throws Exception {
    if(l.size()>1) {
        this.list = new ArrayList<>(l);
    } else {
        throw new Exception("Intersection needs at least two concepts!");
    }
}

关于java - 如何处理toString Java方法中的递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40826819/

相关文章:

java - 使用 JDK1.6.0_131 和 SHA-256 算法

java - 从另一个txt文件复制内容后如何使用Java重命名txt文件

java - 递归函数可以在函数的原始调用中更改变量吗?

javascript - 使用递归搜索整数数组中元素的所有组合

java - 为嵌套类编写 toString 方法

javascript - JavaScript 模板字面量是否保证调用 toString()?

java - JTree 线型和 Nimbus

java - Maven javadoc 插件 3.1.0 不生成聚合 javadoc

python - Python 是否可以在不使用递归的情况下生成排除一组数字的随机数?

java - 如何使我的 while 循环与用户提示一起工作?