【问题标题】:Avoiding recursion in toString method避免 toString 方法中的递归
【发布时间】:2017-12-02 08:39:21
【问题描述】:

这是我在 Java 练习中遇到的巨大难题。所以,我们得到了这个:

public class CyclicEmployee {
    private int age;
    private String name;
    private CyclicEmployee boss;
    private List<CyclicEmployee> subordinate
}

我们的目标是通过切割可能导致递归无穷大的字段来覆盖 toString 方法。最后,它应该看起来像一个带有姓名、年龄、老板和下属的打印对象。

Employee[age=30,name='Mike',boss=Employee[age=45,name='Ann'], subordinate=[Employee[age=25,name='Jimmy']]]

好吧,我试过了,发现我不知道如何处理 toString 覆盖:

import java.util.ArrayList;
import java.util.List;

public class CyclicEmployee {
    private int age;
    private String name;
    private CyclicEmployee boss;
    private List<CyclicEmployee> subordinate ;

public CyclicEmployee(int age, String name) {
    this.age=age;
    this.name=name;
}

public static void main(String[] args) {
  CyclicEmployee Mike = new CyclicEmployee(33,"Mike");
  Mike.boss = new CyclicEmployee(44,"Ann");
  Mike.subordinate = new ArrayList<CyclicEmployee>();
  Mike.subordinate.add(new CyclicEmployee(24,"Jim"));
    System.out.println(Mike.toString());
}

@Override
public String toString() {
    return "CyclicEmployee{" +
            "age=" + age +
            ", name='" + name + '\'' +
            ", boss=" + boss +
            ", subordinate=" + subordinate +
            '}';
    }

}CyclicEmployee{age=33, name='Mike', boss=CyclicEmployee{age=44, name='Ann', boss=null, subordinate=null}, subordinate=[CyclicEmployee{age=24, name='Jim', boss=null, subordinate=null}]}

看来我应该在这里剪掉所有的“空”字段,但我找不到出路。

【问题讨论】:

  • 您的问题是不获取空字段或什么?
  • 简单地说-是的,我想省略它们。
  • 你检查过我的解决方案了吗,对你有用吗?

标签: java tostring overriding


【解决方案1】:

如果我理解正确,您不想打印空 CyclicEmployee 对象。您可以检查bosssubordinates 是否为空,然后在toString() 中跳过它们。由于它们都是相同的类型,因此此方法适用于所有它们。

@Override
public String toString() {

String str = "";
str = "CyclicEmployee{" +
    "age=" + age +
    ", name='" + name + '\'';
if (boss != null) {
  str += ", boss=" + boss;
}
if (subordinate.size() != 0) {
  str += ", subordinate=" + subordinate;
}
  str += '}';
return str;
}

【讨论】:

  • 是的,就是这样!唯一的一点,应该有下属! =null 代替。非常感谢!
  • 好的,因为从属是list 实际上你可能不需要检查它是否为空,我已经检查了它的大小。如果我的回答对您有用,请您接受并投票。
  • 我已经尝试过了,但我的声誉很低,因为我是这里的新手。
  • 但是,我想您应该能够接受答案,因为这是您的问题。请尝试单击我的答案附近的复选标记
  • 完成。抱歉,界面不熟悉。
【解决方案2】:

考虑改用thisthis 等现有数据结构。

但如果你真的想使用你的代码,你可以创建一个 NonCyclicEmployee 类

private static class NonCyclicEmployee {

    private int age;
    private String name;

    public NonCyclicEmployee(int age, String name) {
        this.age=age;
        this.name=name;
    }

    @Override
    public String toString() {
        return "CyclicEmployee{" +
            "age=" + age +
            ", name='" + name + '\'' +
            '}';
    }
}

并在 CyclicEmployee 的 toString() 中使用它。

private CyclicEmployee boss;
private List<CyclicEmployee> subordinate ;
private NonCyclicEmployee ncBoss;
private List<NonCyclicEmployee> ncSubordinate ;

@Override
public String toString() {
    return "CyclicEmployee{" +
        "age=" + age +
        ", name='" + name + '\'' +
        ", boss=" + ncBoss +
        ", subordinate=" + ncSubordinate +
        '}';
}

并创建方法 addBoss() 和 addSubordinate() 来同时创建两个老板(boss 和 ncBoss)和两个下属。

【讨论】:

  • 非常感谢,我会学习 TreeModel 并尝试使用它。顺便说一句,我们可以在 toString 中使用类似 if-else 结构的东西来切割字段吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
相关资源
最近更新 更多