gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:57:57 27 4
gpt4 key购买 nike

我的程序结构如下:一个类表示一个原子概念,它本质上是一个字符串,另一个类由一系列通用概念组成。这两个类都扩展了作为抽象类的类概念,这意味着在列表中我可以同时拥有原子概念和任意嵌套的概念交集。每个概念,无论是原子的还是组合的,都由 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;
}

这是 che 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

如果在 DLRConceptIntersection 构造函数中创建 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com