【问题标题】:Java: Printing LinkedList without square brackets?Java:打印不带方括号的 LinkedList?
【发布时间】:2011-10-21 19:03:54
【问题描述】:

这是一个相当简单的问题。当您打印出 LinkedList 时,如下所示:

System.out.println(list);

它打印出来,用方括号将列表括起来,如下所示:

[thing 1, thing 2, thing 3]

有什么方法可以不带方括号打印出来吗?

【问题讨论】:

    标签: java collections


    【解决方案1】:

    是的 - 迭代列表并打印它(每个后面都有逗号,但最后一个元素)。但是,有一些实用工具可以提供帮助:

    Guava:

    String result = Joiner.on(", ").join(list);
    

    commons-lang:

    String result = StringUtils.join(list, ", ");
    

    还有一点需要注意:不要依赖任何对象的.toString() 方法。它不是为了向用户显示对象,或者用作预定义格式 - 它主要用于调试目的。

    【讨论】:

    • 这个需要 +2 的实用程序和 toString() 位。
    • StringUtils 的导入是什么?
    【解决方案2】:

    一个简单粗暴的答案是:

    String s = list.toString();
    System.out.println(s.substring(1, s.length()-1));
    

    【讨论】:

    • 由于您包含“快速而肮脏”的免责声明,我不会拒绝您的回答。也就是说,这正是我们应该劝阻其他开发人员去做的事情。
    【解决方案3】:

    您可以继承 LinkedList 并覆盖它的 toString() 方法,但这似乎有点过分。相反,迭代它的元素并使用StringBuilderStringBuffer(如果并发是一个问题)构造一个String

    注意:
    我建议您不要遵循@Sean Owen 提供的答案,因为这是依赖于实现的,因此很脆弱。

    【讨论】:

      【解决方案4】:

      这是 LinkedList 上 toString() 的默认实现。您可以扩展 LinkedList 以提供您自己的实现或使用组合并只实现 java.util.List 接口。

      public class MyLinkedList<E> implements List<E>
      {
         private final List<E> delegate;
      
         public MyLinkedList(List<E> list)
         {
            delegate = list;
         }
      
         /**
          * @return see overriden class or implemented interface
          * @see java.lang.Object#toString()
          */
         @Override
         public String toString()
         {
            return "My special toString() method";
         }
      
         // implement rest of the java.util.List interface
      

      【讨论】:

        【解决方案5】:

        修改自AbstractCollection.java:

           /*
            * @return a string representation of a collection
            */
           public static final String collectionToString(Collection c) {
               Iterator<E> it = c.iterator();
               if (! it.hasNext())
                   return "";
        
               StringBuilder sb = new StringBuilder();
               for (;;) {
                   E e = it.next();
                   sb.append(e == c ? "(this Collection)" : e);
                   if (! it.hasNext())
                       return sb.toString();
                   sb.append(',').append(' ');
               }
           }
        

        【讨论】:

          【解决方案6】:
          StrBuilder builder = new StrBuilder(); // apache commons lang.
          for (Object object : yourList)
          {
            builder.appendSeperator(", ");
            builder.append(object.toString());
          }
          
          System.out.println(builder.toString());
          

          【讨论】:

            【解决方案7】:

            您可以获取.toString() 方法返回的字符串并删除第一个和最后一个字符,或者创建自己的列表类并覆盖.toString() 方法以遍历列表并打印不带括号的元素。或者您可以将其作为匿名类来执行,例如:

            List<String> list = new List<String>() {
                public String toString() {
                    // Custom To String Stuff Here
                }
            };
            

            当然我太慢了。

            【讨论】:

              【解决方案8】:

              如果您喜欢 groovy,则无需导入任何内容,只需执行以下操作:

              list = ["thing 1", "thing 2", "thing 3"]    
              println list.collect { i -> "$i" }.join(', ')
              

              事情 1,事情 2,事情 3


              地图收藏也是如此:

              map = [I:"James Bond", love:"rock N roll", id:"007"]
              println map.collect { k,v -> "$k = $v" }.join('\n')
              

              我 = 詹姆斯邦德

              爱 = 摇滚乐

              id = 007

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-11-14
                • 2021-11-16
                • 2011-10-12
                • 2019-02-23
                • 2022-01-10
                • 2022-10-13
                相关资源
                最近更新 更多