Выровнять вывод по левому краю

Рейтинг: -1Ответов: 1Опубликовано: 28.05.2023

Как выровнять текст по левому краю, чтобы не было так:

введите сюда описание изображения

Можно было бы поставить перед строкой "\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();

Ответы

▲ 2Принят

Рассчитывать на то, что символ \t соответствует 4 пробелам также нельзя, так как эта настройка конфигурируется и часто табуляция равна 8 пробелам.

Для решения "проблемы" достаточно выводить содержимое мапы с новой строки между парой символов "{}".

Также представленный код следует улучшить:

  1. использовать типизированную мапу, а не сырую, с последующим явным приведением типа
  2. Оставить одну определённую функцию для метода 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 + "}"));
}