【问题标题】:ArrayList<Contact> toString()ArrayList<联系人> toString()
【发布时间】:2014-03-10 21:19:10
【问题描述】:

我正在模拟一个电话簿,其中我有一个ArrayList&lt;Contact&gt;。如何覆盖 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; }

【问题讨论】:

标签: java arraylist tostring


【解决方案1】:

您可以像这样使用anonymous class 为单个对象定义自己的toString() 方法:

ArrayList<Contact> phonebook = new ArrayList<Contact>() {

    @Override
    public String toString() {
        // do stuff
    }
};

【讨论】:

  • 我对扩展List 有一种不好的感觉。在这种情况下,它似乎是有道理的,但我仍然不会这样做。
  • 我的问题是如何在toString() 中实现for()。因为,如果我理解的话,我只需要返回一个String
  • @user3403611 首先定义一个StringBuilder str,然后使用for (Contact c : this) 遍历列表中的各个元素,并为每个元素添加一个新行到str。循环结束后,返回str.toString()
  • 制作这个:public String toString() { String phoneBookString = ""; for(Contact contact : list) { phoneBookString += contact.toString() + "\n"; } return phoneBookString; }
【解决方案2】:

您需要先覆盖ContacttoString() 方法:

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

这将为phonebook 中的所有Contact 实例调用System.out.println(T),解析为System.out.println(Phonebook)

【讨论】:

    【解决方案3】:

    如果你真的想让toStringArrayList 表现得与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&lt;Contact&gt; 一样,只是toString() 的行为有所不同。

    但是,如果您的计划是在其他 PhoneBook 类中使用它,则不值得这样做;最好在PhoneBook里面写一个私有方法:

    private String toString(ArrayList<Contact> a) { ... }
    

    并改用它。 (如果您有一个具有私有 ArrayList&lt;Contact&gt; 成员的 PhoneBook 类,情况就是这样,并且您唯一的用途是编写 PhoneBook 类的 toString()。没有真正需要编写覆盖 @ 987654335@ 为ArrayList&lt;Contact&gt; 成员;只需编写一个实用方法来创建您想要的字符串。)

    【讨论】:

      【解决方案4】:

      首先,没有很好的方法来@Override ArrayList 的 toString() 方法。 但还有其他不错的选择:

      建议一: 覆盖列表中对象的 toString() 方法。 ArrayList 自动调用封闭类型的 toString 来打印元素的字符串表示。 那么你可以这样做:

      // Converting ArrayList to String using Spring API , result is comma separated String       
      String phonebookToString = StringUtils.collectionToCommaDelimitedString(phonebook);
      
      System.out.println("String converted from ArrayList : " + phonebookToString);
      

      或者这个:

      String phonebookString = "";
      
      for (Phone p : phonebook)
      {
          phonebookString += p.toString() + "\t";
      }
      
      System.out.println(phonebookString);
      

      建议二: 编写静态方法

      static void phoneBookToString(ArrayList<Phone> phonebook) { ... }
      

      按照我在第一个建议中写的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        相关资源
        最近更新 更多