我正在模拟一个PhoneBook,其中我有一个ArrayList<Contact>。如何对toString()函数进行覆盖,以实现像这样的wen做System.out.println(phonebook)
Name: name1; Number: number1; Name: name2; Number: number2; Name: name3; Number: number3; etc.....
这样做是有效的:
public String toString() { String phoneBookString = ""; for(Contact contact : list) { phoneBookString += contact.toString() + "\n"; } return phoneBookString; }
发布于 2014-03-10 21:22:23
可以使用如下所示的toString()为单个对象定义自己的匿名类方法:
ArrayList<Contact> phonebook = new ArrayList<Contact>() {
@Override
public String toString() {
// do stuff
}
};发布于 2014-03-10 21:23:49
首先需要重写Contact的Contact方法:
@Override
public String toString() {
return "your string representation";
}然后,当打印出这段代码,您的phonebook时,您想要做一个for-loop:
for (Contact contact : phonebook) {
System.out.println(contact);
}可能值得考虑将Phonebook作为自己的类,这样您就可以实现自己的toString()方法。
另外,在使用Java 8时,您可以执行以下操作而不是编写3行代码--您可以用一行代码编写它:
phonebook.forEach(System.out::println);这将调用System.out.println(T) (解析为System.out.println(Phonebook) ),用于phonebook中的所有Contact实例。
发布于 2014-03-10 21:27:43
如果您真的希望toString的ArrayList行为与ArrayList的内置toString不同,那么您可以定义自己的子类:
class ContactList extends ArrayList<Contact> {
// duplicate the constructors in ArrayList
public ContactList() { super(); }
public ContactList(Collection<? extends E> c) { super(c); }
public ContactList(int initialCapacity) { super(initialCapacity); }
@Override
public String toString() {
// your version
}
}现在您可以创建ContactList类型的对象了,它们的行为就像ArrayList<Contact>一样,只不过toString()的行为有所不同。
但是,如果您的计划是只在其他类中使用,则不值得为此付出努力;最好在PhoneBook中编写一个私有方法
private String toString(ArrayList<Contact> a) { ... }然后用这个代替。(如果您有一个具有私有PhoneBook成员的ArrayList<Contact>类,并且您唯一的使用是编写您的PhoneBook类的toString(),则情况就是如此。不需要为toString()成员编写重写的ArrayList<Contact>;只需编写实用程序方法来创建所需的字符串。)
https://stackoverflow.com/questions/22311519
复制相似问题