toString()中的无限递归,我该如何防止这种情况?

时间:2017-11-22 22:38:47

标签: java recursion tostring

我已经通过StackOverflow搜索了我自己"并没有运气。我认为我在toString()方法中遇到了无限递归的问题,但我不确定,因为我对此很新。

我认为首先提供给我的代码会让问题更加清晰:

import java.util.ArrayList;

public class User{
    private String name;
    private ArrayList<User> friends;
    private static ArrayList<User> users = new ArrayList<User>();

    public User(String name){
        this.name = name;
        this.friends = new ArrayList<User>();
        users.add(this);
    }

    public void addFriend(User friend){
        friends.add(friend);
    }

    public static void connect(User user1, User user2){
        user1.addFriend(user2);
        user2.addFriend(user1);
    }

    public static ArrayList<User> getUsers(){
        return users;
    }

    public String toString(){
        return String.format("%s : %s", name, friends);
    }   
}

我不确定你是否能看到我想要做的事情,但我toString的格式应该是这样的:

姓名:{friend1,friend2,friend3,...}

例如,与朋友“Bob”和“Charlie”的用户“Alice”会像这样打印

爱丽丝:{Bob,Charlie,}

我不太确定我应该如何继续实现这一目标。任何帮助将非常感激。如果之前已经回答过,我也很抱歉,但我不理解我之前找到的任何答案。

这是我的main方法,可能也会有所帮助:

public class Main{
    public static void main(String args[]){
        User bob = new User("Bob");
        User alice = new User("Alice");
        User charlie = new User("Charlie");

        User.connect(alice, bob);
        User.connect(alice, charlie);

        System.out.println(User.getUsers());
    }
}

3 个答案:

答案 0 :(得分:3)

你需要遍历&#34;朋友&#34;列出并打印每个名称。因为您要打印每个朋友,包括朋友&#39;朋友,这就是你获得无限递归的原因。

尝试类似

的内容
public String toString() {
    int count = 0;
    StringBuilder sb = new StringBuilder("{\"name\"=" + name + ", \"friends\"=[");
    for (User friend : friends) {
        sb.append(friend.getName());
        if (++count < friends.size()) sb.append(", ");
    }
    sb.append("]}");
    return sb.toString();
}

答案 1 :(得分:2)

我怀疑问题在于,当您致电Alice.toString()并开始迭代爱丽丝的朋友列表时,它会调用每位朋友的toString()

如果AliceBob的朋友,而Bob也是Alice的朋友,那么您最终会在Alice.toString()Bob.toString()之间来回蹦蹦跳跳{1}}无限期。

答案 2 :(得分:1)

从我的观点来看,问题可能是,一旦你调用toString,试图显示所有用户,发生的事情是在toString方法中你连续调用用户的朋友的toString。

为了避免递归,尝试迭代用户的朋友列表,并用用户的朋友的信息连接空字符串,而不是再次声明朋友的朋友。总而言之,避免递归:)