Java: функция для массивов, таких как объединение PHP ()?

Я хочу присоединиться к String[] с помощью строки клея. Есть ли функция для этого?

Solutions Collecting From Web of "Java: функция для массивов, таких как объединение PHP ()?"

Начиная с Java8 можно использовать String.join() .

 String.join(", ", new String[]{"Hello", "World", "!"}) 

Формирует:

 Hello, World, ! 

В противном случае Apache Commons Lang имеет класс StringUtils который имеет функцию join которая объединяет массивы вместе, чтобы создать String .

Например:

 StringUtils.join(new String[] {"Hello", "World", "!"}, ", ") 

Создает следующую String :

 Hello, World, ! 

Если вы искали, что использовать в android, это:

 String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens) 

например:

 String joined = TextUtils.join(";", MyStringArray); 

В Java 8 вы можете использовать

1) Stream API:

 String[] a = new String[] {"a", "b", "c"}; String result = Arrays.stream(a).collect(Collectors.joining(", ")); 

2) новый метод String.join: https://stackoverflow.com/a/21756398/466677

3) класс java.util.StringJoiner: http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html

Вы можете легко написать такую ​​функцию примерно в десяти строках кода:

 String combine(String[] s, String glue) { int k = s.length; if ( k == 0 ) { return null; } StringBuilder out = new StringBuilder(); out.append( s[0] ); for ( int x=1; x < k; ++x ) { out.append(glue).append(s[x]); } return out.toString(); } 

Небольшой мод вместо использования substring ():

 //join(String array,delimiter) public static String join(String r[],String d) { if (r.length == 0) return ""; StringBuilder sb = new StringBuilder(); int i; for(i=0;i<r.length-1;i++){ sb.append(r[i]); sb.append(d); } sb.append(r[i]); return sb.toString(); } 

Как и во многих вопросах в последнее время, Java 8 на помощь:


Java 8 добавила новый статический метод в java.lang.String который делает именно то, что вы хотите:

 public static String join(CharSequence delimeter, CharSequence... elements); 

Используй это:

 String s = String.join(", ", new String[] {"Hello", "World", "!"}); 

Результаты в:

 "Hello, World, !" 

Библиотека Google Guava также обладает такими возможностями . Вы также можете увидеть пример String [] из API.

Как уже описано в api, остерегайтесь неизменности методов строителя.

Он может принимать массив объектов, поэтому он будет работать в вашем случае. В моем предыдущем опыте я попытался присоединиться к Stack, который является итерируемым, и он отлично работает.

Образец от меня:

 Deque<String> nameStack = new ArrayDeque<>(); nameStack.push("a coder"); nameStack.push("i am"); System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|"); 

печатает: |i am a coder|

Данный:

 String[] a = new String[] { "Hello", "World", "!" }; 

Затем, в качестве альтернативы ответу Кубинда, где клей «,»:

 Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "") 

Или объединить другую строку, например «& amp;».

 Arrays.asList(a).toString().replaceAll(", ", " &amp; ").replaceAll("^\\[|\\]$", "") 

Однако … этот ТОЛЬКО работает, если вы знаете, что значения в массиве или списке НЕ содержат символьную строку «,».

Если вы используете Spring Framework, то у вас есть класс StringUtils :

 import static org.springframework.util.StringUtils.arrayToDelimitedString; arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n"); 

Не в ядре, нет. Поиск «java array join string glue» даст вам некоторые фрагменты кода о том, как этого добиться.

например

 public static String join(Collection s, String delimiter) { StringBuffer buffer = new StringBuffer(); Iterator iter = s.iterator(); while (iter.hasNext()) { buffer.append(iter.next()); if (iter.hasNext()) { buffer.append(delimiter); } } return buffer.toString(); } 

Если вы приземлились здесь, ища быстрое преобразование между строками, попробуйте Arrays.toString () .

Создает строковое представление Object[] . Результат окружен скобками ( "[]" ), каждый элемент преобразуется в String через String.valueOf(Object) и разделяется String.valueOf(Object) ", " . Если массив равен null , возвращается "null" .

Только для задачи «у меня самый короткий» , вот мины;)

Повторяющийся:

 public static String join(String s, Object... a) { StringBuilder o = new StringBuilder(); for (Iterator<Object> i = Arrays.asList(a).iterator(); i.hasNext();) o.append(i.next()).append(i.hasNext() ? s : ""); return o.toString(); } 

Рекурсивный:

 public static String join(String s, Object... a) { return a.length == 0 ? "" : a[0] + (a.length == 1 ? "" : s + join(s, Arrays.copyOfRange(a, 1, a.length))); } 

Ничего встроенного, о котором я знаю.

Apache Commons Lang имеет класс StringUtils который содержит много функций соединения.

Вот как я это делаю.

 private String join(String[] input, String delimiter) { StringBuilder sb = new StringBuilder(); for(String value : input) { sb.append(value); sb.append(delimiter); } int length = sb.length(); if(length > 0) { // Remove the extra delimiter sb.setLength(length - delimiter.length()); } return sb.toString(); } 

Аналогичная альтернатива

 /** * @param delimiter * @param inStr * @return String */ public static String join(String delimiter, String... inStr) { StringBuilder sb = new StringBuilder(); if (inStr.length > 0) { sb.append(inStr[0]); for (int i = 1; i < inStr.length; i++) { sb.append(delimiter); sb.append(inStr[i]); } } return sb.toString(); } 

Мой спин.

 public static String join(Object[] objects, String delimiter) { if (objects.length == 0) { return ""; } int capacityGuess = (objects.length * objects[0].toString().length()) + ((objects.length - 1) * delimiter.length()); StringBuilder ret = new StringBuilder(capacityGuess); ret.append(objects[0]); for (int i = 1; i < objects.length; i++) { ret.append(delimiter); ret.append(objects[i]); } return ret.toString(); } public static String join(Object... objects) { return join(objects, ""); } 

Вам нравится мой 3-строчный способ, используя только методы класса String?

 static String join(String glue, String[] array) { String line = ""; for (String s : array) line += s + glue; return (array.length == 0) ? line : line.substring(0, line.length() - glue.length()); } 

Чтобы получить «str1, str2» от «str1», «str2», «":

 Stream.of("str1", "str2", "").filter(str -> !str.isEmpty()).collect(Collectors.joining(", ")); 

Также вы можете добавить дополнительный нуль-чек

Если вы используете функциональную Java-библиотеку и по какой-то причине не можете использовать Streams из Java 8 (что может иметь место при использовании Android + Retrolambda plugin), вот вам функциональное решение:

 String joinWithSeparator(List<String> items, String separator) { return items .bind(id -> list(separator, id)) .drop(1) .foldLeft( (result, item) -> result + item, "" ); } 

Обратите внимание, что это не самый эффективный подход, но он работает хорошо для небольших списков.

Я делаю это так, используя StringBuilder:

 public static String join(String[] source, String delimiter) { if ((null == source) || (source.length < 1)) { return ""; } StringBuilder stringbuilder = new StringBuilder(); for (String s : source) { stringbuilder.append(s + delimiter); } return stringbuilder.toString(); } // join((String[], String) 

Существует простая техника сокращения, которую я использую большую часть времени.

 String op = new String; for (int i : is) { op += candidatesArr[i-1]+","; } op = op.substring(0, op.length()-1); 

java.util.Arrays имеет метод asList. Вместе с API java.util.List / ArrayList это дает вам все, что вам нужно :;

 private static String[] join(String[] array1, String[] array2) { List<String> list = new ArrayList<String>(Arrays.asList(array1)); list.addAll(Arrays.asList(array2)); return list.toArray(new String[0]); }