1

这个问题来自一个作业。我必须在创建循环链接列表的类中重写 toString() 方法,实际上我有一个很好用的 toString() 方法,它通过了我所有的测试。所以我的项目是自动评分的,它显然没有 100% 批准我的方法。所以我的问题是:有没有更好的方法来编写这个更有效的 toString() 方法?

public String toString()
    {
        if (size == 0)
        {
            return "[]";
        }
        else
        {
            String output = "";
            Node<E> tempNode = actualElement;
            while (tempNode.next() != actualElement)
            {
                if (output.equals(""))
                {
                    output = "[" + output + tempNode.data().toString();
                    tempNode = tempNode.next();
                }
                else
                {
                    output = output + ", " + tempNode.data().toString();
                    tempNode = tempNode.next();
                }

            }
            output = output + ", " + tempNode.data().toString() + "]";
            return output;
        }

如果我需要详细说明类结构以便更有意义,请告诉我。

4

6 回答 6

4

使用StringBuilder

StringBuilder builder = new StringBuilder();
builder.append("some text");
builder.append("more text");
return builder.toString();
于 2013-04-04T14:30:58.090 回答
0

为了进一步改进它,您可以使用 StringBuilder 并附加每个计算的 String 文字。这可以节省 JVM 创建单个字符串文字的负载,从而提高性能。

于 2013-04-04T14:31:17.697 回答
0

首先,您应该使用 StringBuilder 来连接您的字符串。

看看这里:

http://javarevisited.blogspot.co.at/2011/07/string-vs-stringbuffer-vs-stringbuilder.html

StringBuilder sb = new StringBuidler();
Node<E> tempNode = actualElement;

while (tempNode.next() != actualElement)
{
    if (sb.length() == 0)
    {
        sb.append("[").append(tempNode.data().toString());
    }
    else
    {
        sb.append(", ").append(tempNode.data().toString());
    }
    tempNode = tempNode.next();
}
sb.append(", ").append(tempNode.data().toString()).append("]");
return sb.toString();
于 2013-04-04T14:32:15.707 回答
0

Strings除非字符串生成器在更简单的代码或更好的性能方面提供优势,否则应始终使用

如果您需要连接大量字符串,附加到 aStringBuilder object有效

于 2013-04-04T14:33:05.957 回答
0

改为使用StringBuilder可能会对您有所帮助。这是从 复制的片段AbstractCollection.toString(),请看一下。

 public String toString() {
    Iterator<E> i = iterator();
if (! i.hasNext())
    return "[]";

StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
    E e = i.next();
    sb.append(e == this ? "(this Collection)" : e);
    if (! i.hasNext())
    return sb.append(']').toString();
    sb.append(", ");
}
}
于 2013-04-04T14:34:17.007 回答
0

我假设actualElement是在课堂上的其他地方定义的,尽管更好的名字可能会更好。if (output.equals(""))是不必要的。只需以 [ 开始输出StringBuilder,然后附加到它。

但是,您取决于您​​的列表实际上是循环的。如果这个列表最终没有循环,你会得到一个 NPE。而且,如果列表看起来更像是一个 6,如 [A, B, C, D, E, C, D, E...],那么循环将永远不会结束。

于 2013-04-04T14:36:10.310 回答