有没有比这个例子更好的方法来构建带格式化和附加的字符串?这是一个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对象,这是值得的。
答案 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)
如果KeyType
和ValueType
是您自己定义的类,为什么不在这两个类中重写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();