Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将格式和字符串附加结合起来的惯用方法?_Java_String - Fatal编程技术网

Java 将格式和字符串附加结合起来的惯用方法?

Java 将格式和字符串附加结合起来的惯用方法?,java,string,Java,String,有没有比这个例子更好的方法来构建带格式和附加的字符串?这是一个Java问题 编辑:如果Formatter()能够更像StringBuilder(),或者StringBuilder()能够更像Formatter(),似乎会更好。我特别不喜欢捕捉异常,因为这仅仅是一种“toString”方法,也就是说,微不足道。另外,如果我想在循环后通过%d追加一个整数,该怎么办 String methodToYieldMyInstanceAsString() { Formatter

有没有比这个例子更好的方法来构建带格式和附加的字符串?这是一个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();
    }
String方法toyieldMyInstanceString()
{
格式化程序f=新格式化程序();
f、 格式(“%s%d\n”,thing1,thing2);
for(条目:map.entrySet())
{
尝试
{
f、 out().append(entry.getKey().asString()+);
f、 out().append(entry.getValue().asString()+“\n”);
}
捕获(IOE异常)
{
抛出新的RuntimeException();
}
}
返回f.toString();
}

这段代码的一个优点是,我只使用了一个Formatter对象,不管它值多少钱。

像这样的东西怎么样

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();
}
String方法toyieldMyInstanceString()
{
StringBuilder sb=新的StringBuilder();
sb.append(String.format(“%s%d\n”,thing1,thing2));
for(条目:map.entrySet())
{
String key=entry.getKey().toString();
字符串值=entry.getValue().toString();
附加(键)附加(值);
}
使某人返回字符串();
}

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

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

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

return builder.toString();

如果
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();
StringBuffer buf=new-StringBuffer();
for(条目:map.entrySet()){
buf.append(entry.getKey().toString())
.append(entry.getValue().toString())
.append(“\n”);
}
返回buf.toString();
您的问题是“如何不捕获异常?”

直截了当的回答:

((StringBuilder) f.out()).append(entry.getKey().asString() + " ");
为什么会这样?因为new Formatter()创建一个StringBuilder对象作为目标,而f.out()返回此目标。的append()方法 StringBuilder不声明异常

此外,我不明白,你想用这些代码实现什么。 由于在格式化程序的目标上调用append(),实际上 绕过格式化程序并直接附加到目标。所以 格式化程序的唯一用途是调用

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

如果要避免try/catch块,可以将函数声明为“throws IOException”,但它必须在某个地方被捕获。正在查找StringBuilder吗?我认为StringBuilder不接受像%d这样的格式。实际上,我正在尝试将格式与附加结合起来。您的示例中没有%d种格式。循环前的格式对问题至关重要。@broiyan:我建议将
%d
格式移到
ValueType
类的
toString()方法中:它是应该知道如何将自身打印为字符串的对象:)啊,我误解了你的代码。如果您只想摆脱异常捕获,那么这是一个很好的答案。我以前使用过cast,但我改变了主意,因为它比异常处理更不透明。把太多的东西塞进一行。异常处理使用了很多行,但不需要仔细阅读。关键是要使用%d种格式并进行追加@Tom Jefferys有一个很好的答案,尽管在循环之后使用更多的%d格式,但不幸的是,我想我会实例化更多的格式化程序。这是最好的答案,因为循环之前、之后和内部的f.format(“%f”)调用都被追加在一起。