Avoiding recursion in toString method

 ̄綄美尐妖づ 提交于 2021-02-10 16:14:52

问题


this is my huge mindblowing problem with a Java exercise. So, we've got this:

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

and our goal is to overwrite toString method by cutting fields which may lead to recursive infinity. Finally it's supposed to look like a printed object with a name, age, boss and subordinate.

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

Well, I tried and found that i have no clue how to deal with toString overriding:

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

It seems like I should cut all the "null" fields here, but I can't find the way out.


回答1:


If I understand correctly, you do not want to print null CyclicEmployee objects. You can check if boss and subordinates are null and then if they are skip them in toString(). Since all of them are same type, this method will work for all of them.

@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;
}



回答2:


Consider using existing data structure like this or this instead.

But if you really want to use your code, you can create a NonCyclicEmployee class

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 + '\'' +
            '}';
    }
}

And use it in your toString() of CyclicEmployee.

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 +
        '}';
}

And create a method addBoss() and addSubordinate() to create both bosses (boss and ncBoss) and both subordinate at the same time.



来源:https://stackoverflow.com/questions/47606058/avoiding-recursion-in-tostring-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!