繁体   English   中英

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

[英]How do I override the toString method to display elements in a list in Java?

我已经尝试了好几个小时了,但找不到有效的答案。

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

我尝试使用以下内容:

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

但是,这似乎无济于事,因为我仍然获得了对哈希码的引用。 我知道这是因为我没有正确重写toString方法; 包含@Override批注时出现错误,但据我所知。

我查看了其他一些回答,这些回答说,在列表/集合的情况下,重写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);

  }


}

编辑:

抱歉,我忘了提到我尝试删除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;

但是,当我运行代码时,控制台什么也没显示。 我意识到这是因为我实例化了一个空列表,但是在这一点上,我不知道该怎么办。

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

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

更新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();
}

请注意,您必须将wordList的声明更改为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();
}

并使用如下方法:

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

您不匹配Object.toString()的签名。 (我通常让我的IDE生成存根,帮助很多;)

只需将其添加到您现有的代码中:

@Override
public String toString() {
    return "WordsContainer{" +
            "wordList=(" + toString(wordList) + ")}";
}

但是,您将必须将wordList声明为List

更新:

为了澄清原始答案中的最后一句话:

在您自己的包装WordsContainerwordList声明为

Collection<String> wordList = new ArrayList<String>();

在自己尝试实现toString请使用List<?>作为参数类型。 因此,以上代码在没有其他重构的情况下将无法工作。 要么将wordList声明为List<String>

List<String> wordList = new ArrayList<String>();

或重构您的toString()以将Collection<?>作为参数:

public String toString(Collection<?> list) {
    String result = " ";

    for (Object item : list) {
        result += " " + item.toString();
    }
    return result;
}

由于已为toString()方法提供了参数,因此不再是Object的类toString()方法。 这是一个新方法,并且作为ObjecttoString()的重载版本而不是重写版本。 删除参数。 要正确使用toString() ,您需要具有完全相同的方法签名-

public String toString(){
   //implmentation
}

只需使用List元素本身调用toString()即可。 像这样:

import java.util.List;
import java.util.LinkedList;
public class WordList {
    List<String> list = new LinkedList<String>();
    public static void main(String []args) {
       System.out.println(new WordList());
    }

    @Override
    public String toString() {
        String result = "";
        list.add("Hello");

        list.add("World");
        for (int i = 0; i < list.size(); i++) {
            result += " " + list.get(i).toString();//call toString on element of the list
        }
        return result;
    }
}

输出:“ Hello World”

package listtostringmethod;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class ListToStringMethod {

    enter code here
    public static void main(String[] args) {
        // TODO code application logic here
        //List<String> s = Arrays.asList("a","b","c");
        //s.toString();

        MyList myList = new MyList();
            myList.add("a");
            myList.add("b");
        //myList.toString();
        System.out.println(myList.toString());
    }

}

class MyList extends ArrayList {
    @Override
    public String toString (){
        StringBuffer retVal = new StringBuffer();
        Iterator iterator = this.iterator();
            while (iterator.hasNext()){
                retVal.append(iterator.next()+",");
            }
        return retVal.toString();
    }
}

代码简单明了。 希望这对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM