Рассчитывать на то, что символ \t
соответствует 4 пробелам также нельзя, так как эта настройка конфигурируется и часто табуляция равна 8 пробелам.
Для решения "проблемы" достаточно выводить содержимое мапы с новой строки между парой символов "{}"
.
Также представленный код следует улучшить:
- использовать типизированную мапу, а не сырую, с последующим явным приведением типа
- Оставить одну определённую функцию для метода
toString(Map)
: либо только напечатать содержимое заданной мапы, либо как-то преобразовать мапу в несколько строк нужного формата.
public static<K, V> void printMap(Map<K, V> map) {
System.out.println('{');
for (K key : map.keySet()) {
System.out.print(" "); // желаемые два пробела
System.out.print(key);
System.out.print(": ");
System.out.println(map.get(key));
}
System.out.println('}');
}
Аналогичный метод для получения многострочного представления:
public static<K, V> String toString(Map<K, V> map) {
if (map.isEmpty()) {
return "{}";
}
StringBuilder sb = new StringBuilder();
sb.append('{').append(System.lineSeparator());
for (K key : map.keySet()) {
sb.append(" ").append(key).append(": ").append(map.get(key))
.append(System.lineSeparator());
}
sb.append('}').append(System.lineSeparator());
return sb.toString();
}
Также можно использовать Stream API, в частности коллектор Collectors.joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
:
public static<K, V> String toString(Map<K, V> map) {
String newLine = System.lineSeparator();
return map.isEmpty() ? "{}" : map.keySet().stream()
.map(k -> String.format(" %s: %s", k, map.get(k))) // нужный формат
.collect(Collectors.joining(newLine, "{" + newLine, newLine + "}"));
}