【问题标题】:How to deal with recursion in toString Java method?如何处理 toString Java 方法中的递归?
【发布时间】:2016-11-27 07:47:06
【问题描述】:

我的程序结构如下:一个代表原子概念的类,它本质上是一个字符串,另一个类由一系列通用概念组成。这两个类都扩展了作为抽象类的类 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;
   }

}

这是概念交叉类:

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!
}

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

【问题讨论】:

  • 您有一个包含自身的交集。您想要打印什么?
  • 您知道您的list 正在被共享吗?

标签: java recursion tostring


【解决方案1】:

你有一个循环引用:

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!");
    }
}

【讨论】:

  • 完美!这对我有用!我不打算让交叉点和交叉点2 共享同一个列表,所以这就是循环永远不会结束的原因。谢谢。
  • 我对关于概念补全的相同代码有同样的问题: public ComplementOfConcept(Concept c) { this.concept = c;由于 Concept 是一个抽象类,是否可以像 List 一样做同样的事情?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2013-10-14
相关资源
最近更新 更多