如何使用toString方法将HashMap转换为String时覆盖=符号?

时间:2016-10-06 12:29:26

标签: java hashmap tostring println

以下是将map初始化为的代码的一部分:
Map<Integer,Integer> map = new HashMap<>();
我要修改输出的行是

System.out.println("Price and items "+map.toString());
目前的产出
{100 = 10,200 = 5}

我想显示
{100:10200:5}

3 个答案:

答案 0 :(得分:7)

不要依赖方法toString()作为它是一个实现细节,可以从一个版本的Java更改为另一个版本,您应该实现自己的方法。

假设您使用 Java 8 ,可能是:

public static <K, V> String mapToString(Map<K, V> map) {
    return map.entrySet()
        .stream()
        .map(entry -> entry.getKey() + ":" + entry.getValue())
        .collect(Collectors.joining(", ", "{", "}"));
}

如果您希望AbstractMap#toString()完全相同的实现检查密钥或值是否为当前地图,则代码将为:

public static <K, V> String mapToString(Map<K, V> map) {
    return map.entrySet()
        .stream()
        .map(
            entry -> (entry.getKey() == map ? "(this Map)" : entry.getKey())
                    + ":"
                    + (entry.getValue() == map ? "(this Map)" : entry.getValue()))
        .collect(Collectors.joining(", ", "{", "}"));
}

答案 1 :(得分:2)

由于map是整数整数,你可以使用toString()方法来替换不需要的字符......

做字符串替换:)

map.toString().replace("=",":");

答案 2 :(得分:1)

您无法直接覆盖toString()方法中的符号。

虽然您可以将String.replace用于其中键和值不能包含=的地图(例如Integer s),但您必须提供不同的一般的实施。

如果你看一下AbstractMap.toString()的来源,你可以看到这并不太棘手:

public String toString() {
    Iterator<Entry<K,V>> i = entrySet().iterator();
    if (! i.hasNext())
        return "{}";

    StringBuilder sb = new StringBuilder();
    sb.append('{');
    for (;;) {
        Entry<K,V> e = i.next();
        K key = e.getKey();
        V value = e.getValue();
        sb.append(key   == this ? "(this Map)" : key);
        sb.append('=');
        sb.append(value == this ? "(this Map)" : value);
        if (! i.hasNext())
            return sb.append('}').toString();
        sb.append(", ");
    }
}

您只需将=更改为: