Java-эквиваленты C # String.Format () и String.Join ()

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

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

16 Solutions collect form web for “Java-эквиваленты C # String.Format () и String.Join ()”

Объект String Java имеет метод format (с 1,5), но не метод join .

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

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

Гуава поставляется с classом « Joiner » .

 import com.google.common.base.Joiner; Joiner.on(separator).join(data); 

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

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

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

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

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

Java 8 также добавляет новый class 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" 

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

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

  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(); } 

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

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

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

edit add: добавление String может быть медленным, но если вы работаете с графическим интерфейсом или какой-то кратковременной рутиной, то действительно не имеет значения, возьмете ли вы 0,500 секунд или 0,006, так что если бы у вас была коллекция под названием «joinMe», что вы хотите добавить к существующей строке «target», было бы ужасно просто вставить это:

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

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

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

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

  Iterator iter = args.iterator(); output += iter.hasNext() ? iter.next() : ""; while (iter.hasNext()) { output += "," + iter.next(); } 

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

  public String join(String delim, List 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(); } } 

Если вы хотите объединить (объединить) несколько строк в один, вы должны использовать StringBuilder. Это намного лучше, чем использование

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

Существует также небольшая победа над StringBuffer, поскольку StringBuilder не использует синхронизацию.

Для универсального метода полезности, подобного этому, он будет (в конечном счете) вызываться много раз во многих ситуациях, поэтому вы должны сделать его эффективным и не выделять много преходящих объектов. Мы профилировали множество, много разных приложений Java и почти всегда находим, что конкатенация строк и распределение строк / символов char [] занимают значительное количество времени / памяти.

Наш метод многократной коллекции -> string сначала вычисляет размер требуемого результата, а затем создает StringBuilder с этим начальным размером; это позволяет избежать ненужного дублирования / копирования внутреннего символа [], используемого при добавлении строк.

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

 public static String join(Collection col, String delim) { StringBuilder sb = new StringBuilder(); Iterator 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, поэтому для функции tag я написал:

 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"?>  join com.core.util.ReportUtil java.lang.String join(java.util.List, java.lang.String)   к < ?xml version="1.0" encoding="UTF-8"?>  join com.core.util.ReportUtil java.lang.String join(java.util.List, java.lang.String)   

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

 < %@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%> ${funnyFmt:join(books, ", ")} 

StringUtils – довольно полезный class в библиотеке Apache Commons Lang.

Существует MessageFormat.format() который работает как C # String.Format() .

Я вижу много чрезмерно сложных реализаций String.Join здесь. Если у вас нет Java 1.8, и вы не хотите импортировать новую библиотеку, то реализация ниже должна быть достаточной.

 public String join(Collection col, String delim) { StringBuilder sb = new StringBuilder(); for ( String s : col ) { if ( sb.length() != 0 ) sb.append(delim); sb.append(s); } return sb.toString(); } 
 ArrayList j=new ArrayList<>; j.add(1); j.add(.92); j.add(3); String ntop=j.toString(); //ntop= "[1, 0.92, 3]" 

Таким образом, String ntop сохраняет значение всей коллекции с помощью разделителей и скобок запятой.

Я бы просто использовал оператор конкатенации строк «+» для объединения двух строк. s1 += s2;

  • Когда лучше использовать String.Format vs string concatenation?
  • Почему println (массив) имеет странный выход? ("
  • Как можно объединить две строки?
  • Удаление конечного символа новой строки из входа fgets ()
  • Как преобразовать массив объектов в строковый массив в Java
  • Как предотвратить java.lang.String.split () от создания ведущей пустой строки?
  • MySQL - length () vs char_length ()
  • Нечувствительный к регистру «Содержит (строка)»
  • Как настроить ProviderManifestToken для EF Code First
  • Как преобразовать между байтами и строками в Python 3?
  • Строки Java: «String s = новая строка (« глупо »);
  • Давайте будем гением компьютера.