【问题标题】:toString Override in JavaJava 中的 toString 覆盖
【发布时间】:2013-04-04 14:28:59
【问题描述】:

这个问题来自一个作业。我必须在创建循环链接列表的类中重写 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;
        }

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

【问题讨论】:

  • 您应该使用StringBuilder 进行有效连接。
  • 你说它是自动分级的。你知道确切的评分标准吗?
  • 在循环中与+ 的字符串连接不是最佳的,这可能就是您对自动评分感到厌烦的原因。按照其他人的建议使用StringBuilder
  • @CedricReichenbach 我不知道评分标准是什么......我尝试了几种不同的方法来构建字符串,但这是我迄今为止的“最佳”。
  • 好的,感谢您的提示,似乎每个人都在将我指向 StringBuilder,所以我会调查一下,看看我得到了什么结果。

标签: java performance tostring


【解决方案1】:

使用StringBuilder

StringBuilder builder = new StringBuilder();
builder.append("some text");
builder.append("more text");
return builder.toString();

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      应始终使用Strings,除非string builders 在更简单的代码或更好的性能

      方面具有优势

      如果您需要连接大量字符串,附加到StringBuilder object 会更高效

      【讨论】:

        【解决方案4】:

        我假设actualElement 是在类的其他地方定义的,尽管更好的名称可能会更好。 if (output.equals("")) 是不必要的。只需使用 [ 开始输出 StringBuilder,然后追加即可。

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

        【讨论】:

          【解决方案5】:

          改用StringBuilder可能会帮你一个忙。这是从AbstractCollection.toString()复制的sn-p,看看吧。

           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(", ");
          }
          }
          

          【讨论】:

            【解决方案6】:

            首先你应该使用 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();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-01-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-28
              相关资源
              最近更新 更多