3

我想使用以下紧凑的方式来构建String

String attributes = null;
for (Map.Entry<String, String> kvp : attrs.entrySet())
  attributes += (kvp.getKey() + "='" + kvp.getValue() +"' ");

但结果是一个字符串,其内容为:nullattr1='val1' attr2='val2' attr3='val3'。我认为这是由于对当前值为空+=的 a 执行操作而发生的。String有没有紧凑的方法可以做到这一点而不必attributes每次通过循环检查是否为空?

4

7 回答 7

7
String attributes = "";

将允许这样做,并且适用于 5 或​​ 20 个值的小地图。对于较大的地图,StringBuilder 或 ~Buffer 是要走的路:

StringBuffer sb = new StringBuffer (estimatedSize);
for (X x: xx) 
     sb.append (foo).append (bar).append (baz);
String attributes = sb.toString ();
于 2012-04-24T22:07:14.963 回答
4

String这样做是为了在代码的开头初始化:

String attributes = "";
于 2012-04-24T22:03:51.673 回答
3

null不是空字符串

你应该从而""不是开始null

String attributes = "";
...

如果'...'没有必要,最紧凑的方法是

String attributes = "";
for (Map.Entry<String, String> kvp : attrs.entrySet())
  attributes += kvp + " ";

如果您有很多值,也建议使用StringBuilder而不是 just String

StringBuilder attributes = new StringBuilder();
for (Map.Entry<String, String> kvp : attrs.entrySet())
    attributes.append(kvp.getKey())
              .append("='")
              .append(kvp.getValue())
              .append("' ");
于 2012-04-24T22:04:45.760 回答
2

String attributes = "";
for (Map.Entry kvp : attrs.entrySet())
  attributes += (kvp.getKey() + "='" + kvp.getValue() +"' ");
于 2012-04-24T22:03:59.347 回答
1

其他人都是对的,您可以在String开始时将您的字符串设置为空字符串,但如果您要从大量数据构建字符串,可能需要使用StringBuilder专为字符串构建而设计的对象。

public String getString(Map<String, String> attrs)  {
    StringBuilder bldr = new StringBuilder();
    for (Map.Entry<String, String> kvp : attrs.entrySet()) {
        bldr.append(String.format("'%s'='%s' ", kvp.getKey(), kvp.getValue()));
    }
    return bldr.toString();
}
于 2012-04-24T22:08:55.930 回答
1

与其说,String attributes = null;不如说String attributes = "";

如果您要添加很多字符串,您可能需要查看 StringBuilder,因为这在内部避免了每次在末尾添加新内容时重新分配内存,而 += 就是这样做的。

于 2012-04-24T22:05:03.777 回答
0

初始化attributes为:

String attributes = "";

已编辑

于 2012-04-24T22:04:21.483 回答