我经常需要打印列表或地图,但我不喜欢它们默认的toString()方法的输出。例如,HashMap#toString()输出如下所示:
{key-1=value-1, key-2=value-2, key-3=value-3}但我希望输出是这样的:
key-1 = value-1, key-2 = value-2, key-3 = value-3我创建了一个扩展HashMap的自定义类,并编写了自己的toString()方法,这导致了我真正的问题:
public final class CustomMap<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = 1493227382148892732L;
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
final Iterator<Map.Entry<K, V>> entryIterator = entrySet().iterator();
if (entryIterator.hasNext()) {
final Map.Entry<K, V> entry = entryIterator.next();
builder.append(entry.getKey());
builder.append(" = ");
builder.append(entry.getValue());
}
while (entryIterator.hasNext()) {
final Map.Entry<K, V> entry = entryIterator.next();
builder.append(", ");
builder.append(entry.getKey());
builder.append(" = ");
builder.append(entry.getValue());
}
return builder.toString();
}
}正如您所看到的,我有重复的代码,因为,部分必须省略一次。那么,我如何在没有重复代码的情况下将其重写为一种快速有效的方法呢?
发布于 2014-09-03 12:52:07
我刚刚检查了AbstractCollection的来源,就这样做了:
public final class CustomMap<K, V> extends HashMap<K, V> {
/**
* Serial version UID.
*/
private static final long serialVersionUID = 1493227382148892732L;
@Override
public String toString() {
final Iterator<Map.Entry<K, V>> entryIterator = entrySet().iterator();
if (!entryIterator.hasNext()) {
return "";
}
final StringBuilder builder = new StringBuilder();
for (;;) {
final Map.Entry<K, V> entry = entryIterator.next();
builder.append(entry.getKey());
builder.append(" = ");
builder.append(entry.getValue());
if (!entryIterator.hasNext()) {
return builder.toString();
}
builder.append(", ");
}
}
}这看起来非常聪明,而且循环中只有一个检查。
发布于 2014-09-03 12:36:28
它可以很容易地用布尔值来解决:
final Iterator<Map.Entry<K, V>> entryIterator = entrySet().iterator();
boolean first = true;
while (entryIterator.hasNext()) {
final Map.Entry<K, V> entry = entryIterator.next();
if (!first)
builder.append(", ");
else
first=false;
builder.append(entry.getKey());
builder.append(" = ");
builder.append(entry.getValue());
}另一种选择是使用Java 8 StringJoiner:
StringJoiner sj = new StringJoiner(",");
while (entryIterator.hasNext()) {
final Map.Entry<K, V> entry = entryIterator.next();
sj.add(entry.getKey() + " = " + entry.getValue());
}
return sj.toString();发布于 2014-09-03 12:47:25
不要扩展HashMap,而是在HashMap.toString()上使用String.subString()方法
String s=yourMap.toString();//eg-"{key-1=value-1, key-2=value-2, key-3=value-3}"
System.out.println(s.substring(1,s.length()-1)); 输出: -key-1=value-1,key-2=value-2,key-3=value-3
或
创建删除最后逗号的方法。
public StringBuilder removeComma(StringBuilder sbf) {
if (sbf.charAt(sbf.length() - 1) == ',') {
sbf.deleteCharAt(sbf.length() - 1);
}
return sbf;
}
public String toString() {
final StringBuilder builder = new StringBuilder();
final Iterator<Map.Entry<K, V>> entryIterator = entrySet().iterator();
while (entryIterator.hasNext()) {
final Map.Entry<K, V> entry = entryIterator.next();
builder.append(entry.getKey()).append(" = ").append(entry.getValue()).append(",");
}
return removeComma(builder).toString();
}使用变量另一个选项-
public String toString() {
String comma="";//initaly empty
final StringBuilder builder = new StringBuilder();
final Iterator<Map.Entry<K, V>> entryIterator = entrySet().iterator();
while (entryIterator.hasNext()) {
final Map.Entry<K, V> entry = entryIterator.next();
builder.append(comma).append(entry.getKey()).append(" = ").append(entry.getValue());
comma=",";//set value of comma
}
return removeComma(builder).toString();
}https://stackoverflow.com/questions/25644464
复制相似问题