java - 如何为集合实现 toString() ?

标签 java

我经常需要打印列表或 map ,但我不喜欢它们默认的 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();
    }

}

如您所见,我有重复的代码,因为 , 部分必须省略一次。那么我怎样才能将其重写为一种快速有效的方法而无需重复代码呢?

最佳答案

这可以通过 boolean 值轻松解决:

    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();

关于java - 如何为集合实现 toString() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25644464/

相关文章:

java - 如何重构代码以删除 if 语句?

java - Kotlin 对 VS Code 中的所有内容都会抛出错误

java - 从 Weblogic 服务器到 IIS SSL 服务的 x509 客户端身份验证(无法加载服务器信任的 CA java.lang.NullPointerException)

java - Android - 使用相同的 xml 文件在 Activity 和屏幕之间切换

C# SHA-256 与 Java SHA-256。不同的结果?

Java 小服务程序 : RequestDispatcher doesn't work doesn't redirect paths

java - java中的盒型模式

java - Jenkins - 如果 git 中没有更改,则不要运行构建步骤

java - 在 Java 中使用 Inflater 解压缩 gzip 数据

java - 在 Spring-Boot 中配置 bean