结合格式和字符串追加的惯用方法?

时间:2011-05-13 07:07:15

标签: java string

有没有比这个例子更好的方法来构建带格式化和附加的字符串?这是一个Java问题。

编辑:看起来如果Formatter()能够更像StringBuilder()或者StringBuilder()能够像Formatter()那样会更好。我特别不喜欢必须捕获异常,因为这仅仅是一种“toString”类型的方法,也就是说,是微不足道的。另外,如果我想在循环后通过%d追加一个整数怎么办?

    String methodToYieldMyInstanceAsString()
    {
        Formatter f = new Formatter();
        f.format("%s %d\n", thing1, thing2);

        for (Entry<KeyType, ValueType> entry: map.entrySet())
        {
            try
            {
                f.out().append(entry.getKey().asString() + " ");
                f.out().append(entry.getValue().asString() + "\n");
            }
            catch (IOException e)
            {
                throw new RuntimeException();
            }
        }
        return f.toString();
    }

关于这段代码的一个好处是我只使用一个Formatter对象,这是值得的。

4 个答案:

答案 0 :(得分:1)

如果您自己调用IOException方法,则可以避免format,它只会抛出未经检查的异常。只需稍微更改您的代码:

StringBuilder builder = new StringBuilder();
Formatter f = new Formatter(builder);

for (...) {
    f.format("%s %d\n", entry.getKey(), entry.getValue());
}

return builder.toString();

答案 1 :(得分:1)

您的问题是“如何不必捕捉异常?”。

直接回答:

((StringBuilder) f.out()).append(entry.getKey().asString() + " ");

为什么会这样?因为新的Formatter()创建一个StringBuilder对象作为目标,而f.out()返回此目标。的append()方法 StringBuilder没有声明异常。

此外,我没有得到,你想用该代码完成什么。 因为你实际上是在Formatter的目标上调用append() 绕过Formatter并直接附加到目的地。所以 只使用Formatter是对

的调用
f.format("%s %d\n", thing1, thing2);

答案 2 :(得分:0)

这样的事情......

String methodToYieldMyInstanceAsString()
{

    StringBuilder sb = new StringBuilder();
    sb.append(String.format("%s %d\n", thing1, thing2));

    for (Entry<KeyType, ValueType> entry: map.entrySet())
    {
        String key = entry.getKey().toString();
        String value = entry.getValue().toString();
        sb.append(key).append(value);
    }
    return sb.toString();
}

答案 3 :(得分:0)

如果KeyTypeValueType是您自己定义的类,为什么不在这两个类中重写toString()?然后你可以简单地做

StringBuffer buf = new StringBuffer();
for (Entry<KeyType, ValueType> entry: map.entrySet()) {
  buf.append(entry.getKey().toString())
     .append(entry.getValue().toString())
     .append("\n");
}
return buf.toString();