Как добавить символ новой строки для всех строк, кроме последней? - PullRequest
31 голосов
/ 15 января 2009

Я перебираю HashMap (см. мой предыдущий вопрос для более подробной информации) и строю строку, состоящую из данных, содержащихся в карте. Для каждого элемента у меня будет новая строка, но для самого последнего элемента я не хочу новую строку. Как мне этого добиться? Я думал, что смогу проверить, последняя запись или нет, но я не уверен, как на самом деле это сделать.

Спасибо!

Ответы [ 15 ]

0 голосов
/ 21 ноября 2017

Используйте API для соединения строк JDK:

String result = data.stream()
    .map((k,v) -> String.format("%s : %s", k, v)
    .collect(Collectors.joining("\n"));
0 голосов
/ 17 января 2015

Пусть библиотеки сделают это за вас.

import com.sun.deploy.util.StringUtils;

, как и многие другие, имеет StringUtils, который имеет метод join. Вы можете сделать это в одной строке:

StringUtils.join(list, DELIMITER);

Но для большего контекста, вот как вы могли бы сделать это с помощью hashmap.

public static String getDelimitatedData(HashMap<String, String> data) {
    final String DELIMITER = "\n"; //Should make this a variable
    ArrayList<String> entries = new ArrayList<>();

    for (Map.Entry<String, String> entry : data.entrySet()) {
        entries.add(entry.getKey() + ": " + entry.getValue());
    }

    return StringUtils.join(entries, DELIMITER);
}
0 голосов
/ 17 марта 2009

Ха! Благодаря этому сообщению Я нашел другой способ сделать это:

public static class Extensions
{
    public static string JoinWith(this IEnumerable<string> strings, string separator)
    {
        return String.Join(separator, strings.ToArray());
    }
}

Конечно, сейчас это в C #, и Java (пока) не будет поддерживать метод расширения, но вы должны иметь возможность адаптировать его по мере необходимости & mdash; в любом случае главное - использовать String.Join, и я уверен, что у java есть какой-то аналог.

Также обратите внимание, что это означает выполнение дополнительной итерации строк, потому что вы должны сначала создать массив, а затем выполнить итерацию по нему для построения вашей строки. Кроме того, вы создадите массив, где с помощью некоторых других методов вы сможете обойтись с IEnumerable, который одновременно хранит только одну строку в памяти. Но мне очень нравится дополнительная ясность.

Конечно, учитывая возможность метода Extension, вы можете просто абстрагировать любой другой код в метод расширения.

0 голосов
/ 06 марта 2009

Если вы используете Class Separator , вы можете сделать

StringBuilder buf = new StringBuilder();
Separator separator = new Separator("\n");
for (Map.Entry<MyClass.Key,String> entry: data.entrySet()) {
    builder.append(separator)
       .append(entry.key())
       .append(": ")
       .append(entry.value());
}

Разделитель печатает пустую строку при первом использовании, а разделитель - при последующем использовании.

0 голосов
/ 23 января 2009

Здесь пригодится метод соединения, чтобы дополнить разбиение, потому что тогда вы можете просто соединить все элементы, используя новую строку в качестве разделителя, и, конечно, он не добавляет новую строку в конец результата; Вот как я это делаю на разных языках сценариев (Javascript, PHP и т. д.).

...