22 ответов:
начиная от 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) новую строку.метод соединения: https://stackoverflow.com/a/21756398/466677
3) java.утиль.Класс 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, остерегайтесь неизменности методов builder.
Он может принимать массив объектов, поэтому он будет работать в вашем случае. В моем предыдущем опыте я попытался присоединиться к стеку, который является итерационным, и он отлично работает.
пример от меня :
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", "!" };тогда в качестве альтернативы ответу coobird, где клей",":
Arrays.asList(a).toString().replaceAll("^\[|\]$", "")или для объединения с другой строкой, например " & ".
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(); }
если вы приземлились здесь в поисках быстрого преобразования массива в строку, попробуйте массивы.toString ().
создает строковое представление
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 выглядит следующим образом, стр2" из "str1 выглядит следующим образом", "стр2", "" :
Stream.of("str1", "str2", "").filter(str -> !str.isEmpty()).collect(Collectors.joining(", "));также вы можете добавить дополнительную null-проверка
Если вы используете функциональную библиотеку Java и по какой-то причине не можете использовать потоки из Java 8 (что может иметь место при использовании плагина Android + Retrolambda), вот функциональное решение для вас:
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.утиль.Массивы также asList метод. Вместе с java.утиль.List / ArrayList API это дает вам все, что вам нужно:;
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]); }
Comments