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

我必须重写类 Person 的ToString方法,以便 p1.toString() 产生Green, Jim。结果,上面代码的输出将[Green, Jim,White, Tony]是不可取的。如果输出是,例如,文本处理程序会更容易[Green, Jim&White, Tony]。默认分隔符需要替换为其他符号,例如&。如果有的话,最简单的方法是什么?

4

5 回答 5

3

为什么需要使用 toString 方法来执行此操作?

我建议您将列表传递给您自己制作的自定义格式化程序类。但是,如果您坚持,我认为另一种选择是您扩展 ArrayList 并仅覆盖 toString 方法。

一种选择可能是让 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

我想你几个小时前刚问了一个类似的问题。但这里有一点不同。对于这种情况,您只需要从您的toString()方法中返回字段的串联。

为什么不在名称之间而不是在 ArrayList 中使用不同的分隔符。那将是更容易的任务:-

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

这给你: -

[Green:Jim, White:Tony]

并且上面的表示看起来更清晰,并且清楚地将您names与分开,,因为它应该在任何列表的情况下。元素应始终与,else 分开,否则可能会在以后造成混乱。对于 EG:-

[Green, Jim&White, Tony]

上面的列表在我看来是一个 3 元素列表,其值为:- GreenJim&WhiteTony

PS: -

你永远不应该public为你的fields. 您的字段应始终为private,除非您确实需要直接在课堂外使用。而是提供公共访问器方法来访问它们。我什至建议使用getterssetters访问同一类中的字段。

于 2012-10-23T13:11:16.863 回答
2

为什么不 [firstname,lastname]从您的 Person 类返回?

所以如果你有一个清单,你会得到[[Jim,Green],[Tony,White]],在这种情况下,你可以轻松清楚地看到你有什么?

于 2012-10-23T13:16:05.653 回答
2

正如其他人所说,自定义格式化程序是最佳选择。另一种选择是实现您自己的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 回答