【问题标题】:Why does Arrays.toString(values).trim() produce [bracketed text]?为什么 Arrays.toString(values).trim() 会产生[括号内的文本]?
【发布时间】:2010-10-11 22:52:52
【问题描述】:
Map<String, String[]> map = request.getParameterMap();
for (Entry<String, String[]> entry : map.entrySet())
{
    String name = entry.getKey();
    String[] values = entry.getValue();
    String valuesStr = Arrays.toString(values).trim();
    LOGGER.warn(valuesStr);

我正在尝试使用上面的代码查看请求参数值。

为什么Arrays.toString(values).trim(); 把参数值括起来所以看起来像这样:

[Georgio]

在此处获取不带括号的字符串的最佳方法是什么?

如果我这样做:

String valuesStr = values[0].trim();

似乎存在丢失数组中后续值的风险。

【问题讨论】:

    标签: java arrays tostring


    【解决方案1】:

    这只是Arrays.toString(Object[]) 方法应用的默认格式。如果您想跳过括号,您可以自己构建字符串,例如:

    public static String toString(Object[] values)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < values.length; i++)
        {
            if (i != 0)
                sb.append(", ");
            sb.append(values[i].toString());
        }
        return sb.toString();
    }
    

    【讨论】:

    • 你应该使用StringBuilder(不同步)而不是StringBuffer(同步)。
    • 我认为sb.append(', '); 需要双引号。
    【解决方案2】:

    如果您想要的输出是由逗号(或其他)分隔的值列表, 我喜欢Guava's Joiner 的方法:

    String valuesStr = Joiner.on(",").join(values)

    【讨论】:

      【解决方案3】:

      Java 的 Arrays toString 方法的默认实现就是这样。 您可以创建一个扩展它的类,专门用于您想要的内容,并覆盖 toString 方法以使其生成您喜欢的字符串,没有“[”“]”,以及您喜欢和需要的其他限制。

      【讨论】:

      • 从技术上讲,您不能扩展 java.util.Arrays,因为它没有公共(或受保护)构造函数。
      • 而且,因为这些方法是静态的,所以这样做没有任何意义。
      • 你说的很对。我很抱歉。即使再看一遍代码,也很明显它是静态的,因为调用 toString 方法的方式是这样的。然后他应该在任何类中创建另一个静态方法,以自定义方式处理字符串向量。
      【解决方案4】:

      我相信这就是 Arrays.toString(Object[]) 的实现方式,至少在 Sun JVM 上是这样。如果数组有多个元素,您会看到类似[foo, bar, baz]

      您是否希望获得基本相同的输出,但不带括号?例如。 foo, bar, baz ?如果是这样,那么编写自己的方法应该很容易。

      【讨论】:

        【解决方案5】:

        我建议你使用字符串生成器或番石榴的连接器,但如果你想快速修复,你可以试试这个:

        Arrays.toString(values).split("[\\[\\]]")[1];
        

        注意:仅当值本身不包含括号时才使用上述方法。

        StringBuilder 实现:

         static String toString(Object ... strings)
         {
            if(strings.length==0)
                return "";
            StringBuilder sb=new StringBuilder();
            int last=strings.length-1;
            for(int i=0;i<last;i++)
                sb.append(strings[i]).append(",");
            sb.append(strings[last]);
            return sb.toString();
         }
        

        更新:

        使用子字符串:

        String s=(s=Arrays.toString(arr)).substring(1,s.length()-1); 
        

        【讨论】:

        • 如果值本身包含括号怎么办?
        • 如果objs.length==0,您使用StringBuilder 的示例代码将中断。请参阅我对同一问题的回答,以获得正确处理此案例的解决方案。
        • Arrays.toString(values).toString().split(...) 中的第二次toString 调用有什么原因吗?
        • @Grodriguez:不,这是我的错误。已更正。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多