我一直试图解决这个问题几个小时,但我找不到一个有效的答案。
为了完整起见,我已在下面发布了完整的代码。如果我不覆盖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;
} 但是当我运行代码时,控制台什么也没显示。我意识到这是因为我实例化了一个空列表,但此时我还不知道还能做什么。
答案 0 :(得分:3)
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);
}
答案 1 :(得分:2)
您与Object.toString()
的签名不符。 (我通常让我的IDE生成一个存根,有很多帮助;))
只需将其添加到现有代码中:
@Override
public String toString() {
return "WordsContainer{" +
"wordList=(" + toString(wordList) + ")}";
}
但是,您必须将wordList
声明为List
。
<强>更新强>
澄清原答案中的最后一句话:
在您自己的包装器WordsContainer
中,您将wordList
声明为
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;
}
答案 2 :(得分:0)
由于您为toString()
方法提供了参数,因此它不再是Object
的类toString()
方法。这是一种新方法,可以作为Object
的{{1}}的重载版本,而不是被覆盖的版本。删除参数。要正确使用toString()
,您需要具有完全相同的方法签名 -
toString()
答案 3 :(得分:0)
只需使用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'
答案 4 :(得分:0)
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();
}
}
代码很简单。希望这对你有所帮助。