1
class Person {
  public String firstname;
  public String lastname;
}

Person p1 = new Person("Jim","Green");
Person p2 = new Person("Tony","White");

ArrayList<Person> people = new ArrayList<Person>();

people.add(p1);
people.add(p2);

System.out.println(people.toString());

ToStringp1.toString()がを生成するように、クラスPersonのメソッドをオーバーライドする必要がありますGreen, Jim。結果として、上記のコードの出力は[Green, Jim,White, Tony]望ましくないものになります。たとえば、出力がの場合、テキスト処理プログラムの方が簡単です[Green, Jim&White, Tony]。デフォルトの区切り文字は、&などの他の記号に置き換える必要があります。もしあれば、それを達成するための最も簡単な方法は何ですか?

4

5 に答える 5

3

toString メソッドでこれを行う必要があるのはなぜですか?

独自に作成したカスタマイズされたフォーマッタ クラスにリストを渡すことをお勧めします。ただし、どうしてもというのであれば、ArrayList を拡張して toString メソッドのみをオーバーライドするのも 1 つの方法だと思います。

1 つの選択肢は、Person クラス自体に、独自のタイプのアイテムのコレクションをフォーマットする複雑さを処理させることです。

public class Person {
    private String firstName;
    private String lastName;

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return this.lastName + ", " + this.firstName;
    }

    public static String toString(Collection<Person> persons) {
        Iterator<Person> it = persons.iterator();
        if (!it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            Person e = it.next();
            sb.append(e);
            if (!it.hasNext())
                return sb.append(']').toString();
            sb.append('&').append(' ');
        }
    }
}

次に、次のようなことを簡単に行うことができます。

Person p1 = new Person("Obi-wan", "Kenobi");
Person p2 = new Person("Luke", "Skywalker");
List<Person> jedis = new ArrayList<>();
jedis.add(p1);
jedis.add(p2);
System.out.println(Person.toString(jedis));

出力は次のとおりです。[Kenobi, Obi-wan& Skywalker, Luke]

しかし、これは単なるアイデアです。他にもたくさんの方法があると確信しています。

于 2012-10-23T13:11:33.540 に答える
2

[firstname,lastname]Person クラスから戻ってみません か?

したがって、リストがあれば、 が得られます[[Jim,Green],[Tony,White]]。この場合、何を持っているかを簡単かつ明確に確認できますか?

于 2012-10-23T13:16:05.653 に答える
2

数時間前に同様の質問をしたばかりだと思います。しかし、ここでも少し違いがあります。この場合、toString()メソッドからフィールドの連結を返すだけで済みます。

ArrayList ではなく、名前の間に別の区切り文字を使用しないのはなぜですか。それははるかに簡単な作業になります: -

@Override
public String toString() {
    return this.lastname+ ":" + this.firstname;
}

これにより以下が得られます: -

[Green:Jim, White:Tony]

そして、上記の表現ははるかにきれいに見え、List の場合と同様に、nameswithを明確に分離しています。,要素は常に分離する必要が,あります。そうしないと、後で混乱が生じる可能性があります。EGの場合: -

[Green, Jim&White, Tony]

上記のリストは、次の値を持つ 3 つの要素のリストのように思えます: - GreenJim&White、およびTony

PS : -

publicには修飾子を使用しないでくださいfieldsprivateクラス外で直接使用する必要が本当にない限り、フィールドは常に にする必要があります。代わりに、それらにアクセスするためのパブリック アクセサー メソッドを提供します。同じクラスのフィールドを使用gettersしてアクセスすることもお勧めします。setters

于 2012-10-23T13:11:16.863 に答える
2

他の人が言ったように、カスタム フォーマッタが最適なオプションです。もう 1 つのオプションはArrayList、デフォルトをオーバーライドする独自のカスタムを実装することですtoString()。したがって、Person.toString()正しく動作するようになったら、次のような ArrayList クラスを作成できます。

import java.util.ArrayList;

public class CustomArrayList<T> extends ArrayList<T> {

    private static final long serialVersionUID = 1L;

    @Override
    public String toString() {

        int size = size();

        StringBuilder output = new StringBuilder();

        String delimiter = "&";

        for (int i = 0; i < size; i++) {

            output.append( get( i ) );
            if ( i < size - 1 ) {

                output.append( delimiter );
            }
        }

        return output.toString();
    }
}
于 2012-10-23T13:23:36.113 に答える
0

Person クラスの toString() をオーバーライドし、別の区切り文字を使用して「Green Jim」を出力として出力できます

class Person {
    public String firstname;
    public String lastname;

    @Override
    public String toString() { 
        return lastname + " " + firstname;
    }
}

出力は次のように変わります

[Green Jim,White Tony]
于 2012-10-23T13:14:31.977 に答える