如何覆盖 toString 方法以在 Java 中显示列表中的元素?

Fro*_*619 0 java

几个小时以来,我一直试图弄清楚这一点,但我找不到有效的答案。

为了完整起见,我在下面发布了整个代码。如果我不覆盖 toString 方法,我将获得对象哈希码的表示。

我尝试使用以下方法:

 public  String toString(List<?> list) {
String result = " ";
    for (int i = 0; i < list.size(); i++) {
        result += " " + list.get(i);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎没有帮助,因为我仍然得到了对哈希码的引用。我知道这是因为我没有正确覆盖 toString 方法;当我包含 @Override 注释时出现错误,但这是我所能得到的。

我查看了一些其他答案,这些答案说在 Lists/Collections 的情况下覆盖 toString 方法没有用,但没有给出其他替代方法的适当指导。

public class WordsContainer {
Collection<String> wordList = new ArrayList<String>();

public void wordGroup1() {
    wordList.add("Ant");
    wordList.add("Almond");
    /// more words
  }

public Collection<String> getRandomWords() {
    wordGroup1();
    LinkedList<String> wordLinkedList = new LinkedList<String>(wordList);
    ArrayList<String> subList = new ArrayList<String>();

    int i = 0;
    while (i < 6) {
        int index = (int) Math.random() * 10;
        if (!subList.contains(wordLinkedList.get(index))) {
            subList.add(wordLinkedList.get(index));
            i++;
        }
    }
    return subList;
}

public  String toString(List<?> list) {
String result = " ";
    for (int i = 0; i < list.size(); i++) {
        result += " " + list.get(i);
      }
    return result;
    }
 }

public class wordsContainerTest {
public static void main(String[] args) {
    wordsContainer list1 = new wordsContainer();

    list1.wordGroup1(); 

    System.out.println(list1);

  }


}
Run Code Online (Sandbox Code Playgroud)

编辑 :

抱歉,我忘了提到我尝试删除 Override 方法中的参数,如下所示:

public  String toString() {
  LinkedList<String> list = new LinkedList<>()
   String result = " ";
   for (int i = 0; i < list.size(); i++) {
    result += " " + list.get(i);
}
return result;
Run Code Online (Sandbox Code Playgroud)

但是当我运行代码时,控制台什么也没显示。我意识到这是因为我实例化了一个空列表,但此时我不知道还能做什么。

Jan*_*ken 5

toString()没有论据。像这样覆盖它(假设您正在扩展 List 类):

@Override
public String toString() {
    String result = " ";
    for (int i = 0; i < this.size(); i++) {
        result += " " + this.get(i);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

更新 01

好了,看来你真正想做的是打印你的WordsContainer封装的列表的内容。

像这样覆盖 WordsContainer 的 toString:

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append(" "); // remove this if you do not want two spaces at the front of the returned string
    for (int i = 0; i < this.wordList.size(); i++) {
        sb.append(" " + this.wordList.get(i).toString());
    }
    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须将 wordList 的声明更改为 type List<String>

更新 02

这回答了评论中的后续问题。

您可以声明一个静态实用程序方法,该方法构建任何给定字符串列表的内容的字符串表示,如下所示:

public static String getStringRepresentation(List<String> list) {
    StringBuilder sb = new StringBuilder();
    sb.append(" "); // remove this if you do not want two spaces at the front of the returned string
    for (int i = 0; i < list.size(); i++) {
        sb.append(" " + list.get(i).toString());
    }
    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用这种方法:

public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("foo");
    list.add("bar");
    String listStringRepr = WordsContainer.getStringRepresentation(list);
    System.out.println(listStringRepr);
}
Run Code Online (Sandbox Code Playgroud)

  • 不要重新发明轮子:`return list.stream().collect(Collectors.joining(" "));` (2认同)