首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为集合实现toString()?

如何为集合实现toString()?
EN

Stack Overflow用户
提问于 2014-09-03 12:34:04
回答 3查看 284关注 0票数 0

我经常需要打印列表或地图,但我不喜欢它们默认的toString()方法的输出。例如,HashMap#toString()输出如下所示:

代码语言:javascript
复制
{key-1=value-1, key-2=value-2, key-3=value-3}

但我希望输出是这样的:

代码语言:javascript
复制
key-1 = value-1, key-2 = value-2, key-3 = value-3

我创建了一个扩展HashMap的自定义类,并编写了自己的toString()方法,这导致了我真正的问题:

代码语言:javascript
复制
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();
    }

}

正如您所看到的,我有重复的代码,因为,部分必须省略一次。那么,我如何在没有重复代码的情况下将其重写为一种快速有效的方法呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-03 12:52:07

我刚刚检查了AbstractCollection的来源,就这样做了:

代码语言:javascript
复制
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(", ");
        }
    }

}

这看起来非常聪明,而且循环中只有一个检查。

票数 0
EN

Stack Overflow用户

发布于 2014-09-03 12:36:28

它可以很容易地用布尔值来解决:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
    StringJoiner sj = new StringJoiner(",");
    while (entryIterator.hasNext()) {
        final Map.Entry<K, V> entry = entryIterator.next();
        sj.add(entry.getKey() + " = " + entry.getValue());
    }
    return sj.toString();
票数 2
EN

Stack Overflow用户

发布于 2014-09-03 12:47:25

不要扩展HashMap,而是在HashMap.toString()上使用String.subString()方法

代码语言:javascript
复制
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

创建删除最后逗号的方法。

代码语言:javascript
复制
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();
      }

使用变量另一个选项-

代码语言:javascript
复制
 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();
              }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25644464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档