2017-11-22 5 views
2

私はStackOverflowで検索しましたが、これは "自分自身で"これを把握しようとしています。私は私がtoString()の方法で無限の再帰の問題に座っていると思うが、私はこれについて全く新しいので確信は持てない。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); 
    } 
} 

が、友人とユーザー「アリス」「ボブ」と「チャーリー」、例えば{friend1、friend2、friend3、...}

名前:私のtoStringのフォーマットは、このようなことになっていますこのように印刷されます

アリス:{Bob、Charlie、}

私はこれを達成するためにどのように進むべきかはわかりません。どんな助けでも大歓迎です。これまでに答えがあるのか​​どうか謝りましたが、私が以前に見つけた答えは理解できませんでした。

これは私のmain -methodあり、また、役に立つかもしれません:

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

あなたがゲットしているエラーは何ですか?何がうまくいかないのですか? – CodeGhost

+0

@CodeGhostエラーはとても信じられないほど長く、私はそれをすべてに収めることができないので、最初にそれを含めなかったのですが、私はここでできることを投稿します: 編集:それは長すぎます50K文字を超えています。エラーのどの部分が最も重要かわかりません。ここに画像を投稿する方法はありますか? java.lang.StringBuilder.append(のStringBuilderでjava.lang.String.valueOfでUser.toStringで –

+0

@CodeGhost (User.java:28) \t(String.java:2994) \t。Javaの:131)java.util.AbstractCollection.toString(AbstractCollection.java:462)で \t java.util.Formatter $ FormatSpecifier.printString(Formatter.java:2886)で \tで \t java.util.Formatter $ FormatSpecifier .PRINT(Formatter.java:2763)java.util.Formatter.format(Formatter.java:2520)で \t java.util.Formatter.format(Formatter.java:2455)されるjava.langにおける \tで\t。 String.format(String.java:2940) これらの数行は、ほとんどが自分自身を繰り返しています。 –

答えて

3

あなたは「友人」リストを反復処理すると、ちょうどそれぞれの名前を印刷する必要があります。なぜならあなたは無限の再帰を得ているからです。

は、私は問題はあなたがAlice.toString()を呼び出すときにということで、あなたがアリスの友人のリストを反復処理を開始、それはそれぞれの友人のtoString()を呼び出すことが疑われる

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

ありがとうございます、私はそのアプローチを試してみましょう。私はそれに精通していないので、まずStringBuilderが何であるかを見ていきます。あなたが気にしているかどうかを説明してください。私がグーグルで見つけたものよりも役に立つかもしれません。 –

+1

これは文字列を編集するための、文字列連結よりもメモリ効率のよい構造です。文字列の連結を使用しても構いません。 – Mike

+0

ああ、大丈夫です。ありがとうございました! –

2

のようなものを試してみてください。

AliceBobと友達になり、BobAliceと友達である場合は、Alice.toString()と無期限Bob.toString()の間で前後に跳ねる終わります。

+0

それは全然意味があります。私にさえ起こりませんでした。この仕事をするために私を正しい道で導く方法はありますか?私はもちろんそれを自分で修正しようとしますが、正しい道を押し進めることは非常に高く評価されます。 –

+0

マイクの答えを参照してください。 – NAMS

1

私の考えから見ると、問題は、すべてのユーザーを表示しようとすると、toStringメソッドを呼び出すと、toStringメソッドでtoStringメソッドを呼び出したときに、 。

再帰性を避けるには、ユーザーの友人のリストを繰り返し処理し、空の文字列にユーザーの友人の情報を連結して、友人の友人を再度宣言しないようにしてください。要約すると、再帰を避けてください:)

関連する問題