Java-эквиваленты C # String.Format () и String.Join () - PullRequest
108 голосов
/ 09 октября 2008

Я знаю, что это немного новый вопрос, но есть ли эквиваленты строковым операциям C # в Java?

В частности, я говорю о String.Format и String.Join.

Ответы [ 16 ]

91 голосов
/ 09 октября 2008

У объекта Java String есть метод format (по состоянию на 1.5), но нет метода join.

Чтобы получить набор полезных методов String, которые еще не включены, вы можете использовать org.apache.commons.lang.StringUtils .

46 голосов
/ 09 октября 2008

string.Format . Что касается присоединения, вам нужно написать свое собственное:

 static String join(Collection<?> s, String delimiter) {
     StringBuilder builder = new StringBuilder();
     Iterator<?> iter = s.iterator();
     while (iter.hasNext()) {
         builder.append(iter.next());
         if (!iter.hasNext()) {
           break;                  
         }
         builder.append(delimiter);
     }
     return builder.toString();
 }

Выше приведено от http://snippets.dzone.com/posts/show/91

38 голосов
/ 29 июня 2011

Гуава поставляется с классом Joiner .

import com.google.common.base.Joiner;

Joiner.on(separator).join(data);
29 голосов
/ 13 февраля 2014

Начиная с Java 8, join() теперь доступен как два метода класса для класса String. В обоих случаях первым аргументом является разделитель.

Вы можете передать отдельные CharSequence s в качестве дополнительных аргументов :

String joined = String.join(", ", "Antimony", "Arsenic", "Aluminum", "Selenium");
// "Antimony, Arsenic, Alumninum, Selenium"

Или вы можете передать Iterable<? extends CharSequence>:

List<String> strings = new LinkedList<String>();
strings.add("EX");
strings.add("TER");
strings.add("MIN");
strings.add("ATE");

String joined = String.join("-", strings);
// "EX-TER-MIN-ATE"

Java 8 также добавляет новый класс, StringJoiner, который вы можете использовать так:

StringJoiner joiner = new StringJoiner("&");
joiner.add("x=9");
joiner.add("y=5667.7");
joiner.add("z=-33.0");

String joined = joiner.toString();
// "x=9&y=5667.7&z=-33.0"
17 голосов
/ 02 мая 2013

TextUtils.join доступно на Android

12 голосов
/ 24 июня 2011

Вы также можете использовать переменные аргументы для строк следующим образом:

  String join (String delim, String ... data) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < data.length; i++) {
      sb.append(data[i]);
      if (i >= data.length-1) {break;}
      sb.append(delim);
    }
    return sb.toString();
  }
4 голосов
/ 05 апреля 2014

Вот довольно простой ответ. Используйте +=, так как кода меньше, и пусть оптимизатор преобразует его в StringBuilder для вас. Используя этот метод, вам не нужно выполнять какие-либо проверки «в последний раз» в цикле (улучшение производительности) и вам не нужно беспокоиться об удалении разделителей в конце.

        Iterator<String> iter = args.iterator();
        output += iter.hasNext() ? iter.next() : "";
        while (iter.hasNext()) {
            output += "," + iter.next();
        }
4 голосов
/ 09 октября 2008

Что касается соединения, я думаю, это может выглядеть немного менее сложно:

public String join (Collection<String> c) {
    StringBuilder sb=new StringBuilder();
    for(String s: c)
        sb.append(s);
    return sb.toString();
}

Я не могу использовать синтаксис Java 5 так часто, как хотелось бы (верьте, хотите нет, я в последнее время пользуюсь 1.0.x), поэтому я могу быть немного ржавым, но я уверен, что концепция верна.

редактировать добавление: Добавление строк может быть медленным, но если вы работаете с кодом GUI или какой-то непродолжительной подпрограммой, на самом деле не имеет значения, будете ли вы использовать 0,005 секунды или 0,006, поэтому если у вас есть коллекция "joinMe", который вы хотите добавить к существующей строке "target", было бы ужасно просто вставить следующее:

for(String s : joinMe)
    target += s;

Это довольно неэффективно (и вредная привычка), но не все, что вы сможете воспринимать, если нет тысяч строк, или это внутри огромного цикла, или ваш код действительно критичен к производительности.

Что еще более важно, это легко запомнить, коротко, быстро и очень читабельно. Производительность не всегда является автоматическим победителем в выборе дизайна.

2 голосов
/ 10 марта 2014

Я не хотел импортировать всю библиотеку Apache, чтобы добавить простую функцию соединения, поэтому вот мой взлом.

    public String join(String delim, List<String> destinations) {
        StringBuilder sb = new StringBuilder();
        int delimLength = delim.length();

        for (String s: destinations) {
            sb.append(s);
            sb.append(delim);
        }

        // we have appended the delimiter to the end 
        // in the previous for-loop. Let's now remove it.
        if (sb.length() >= delimLength) {
            return sb.substring(0, sb.length() - delimLength);
        } else {
            return sb.toString();
        }
    }
1 голос
/ 05 апреля 2013

Я написал собственный:

public static String join(Collection<String> col, String delim) {
    StringBuilder sb = new StringBuilder();
    Iterator<String> iter = col.iterator();
    if (iter.hasNext())
        sb.append(iter.next().toString());
    while (iter.hasNext()) {
        sb.append(delim);
        sb.append(iter.next().toString());
    }
    return sb.toString();
}

, но Collection не поддерживается JSP, поэтому для функции тега я написал:

public static String join(List<?> list, String delim) {
    int len = list.size();
    if (len == 0)
        return "";
    StringBuilder sb = new StringBuilder(list.get(0).toString());
    for (int i = 1; i < len; i++) {
        sb.append(delim);
        sb.append(list.get(i).toString());
    }
    return sb.toString();
}

и положить в .tld файл:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
    <function>
        <name>join</name>
        <function-class>com.core.util.ReportUtil</function-class>
        <function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature>
    </function>
</taglib>

и использовать его в файлах JSP как:

<%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%>
${funnyFmt:join(books, ", ")}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...