Я хочу присоединиться к String[]
с помощью строки клея. Есть ли функция для этого?
Начиная с 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(", ", " & ").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]); }