Выровнять вывод по левому краю
Как выровнять текст по левому краю, чтобы не было так:
Можно было бы поставить перед строкой "\t" но это четыре пробела, а нужно один или два.
public static String toString(Map map) {
System.out.print("{");
for (Object key : map.keySet()) {
Integer value = (Integer) map.get(key);
System.out.println("\t" + key + ":" + " " + value);
System.out.println("}");
return map.toString();
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Рассчитывать на то, что символ \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 + "}"));
}
