我搜索了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,}

我不太确定应该如何继续实现这一目标。任何帮助将非常感激。如果以前已经回答过这个问题,我也深表歉意,但是我不明白我之前找到的任何答案。

这是我的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());
    }
}

最佳答案

您需要遍历“朋友”列表,然后仅打印每个人的姓名。因为您要打印每个朋友,所以其中包括朋友的朋友,这就是您获得无限递归的原因。

尝试类似的东西

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();
}

关于java - toString()中的无限递归,如何防止这种情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47444950/

10-12 04:18