Я хочу приєднатись String[]
до клею. Чи є для цього функція?
Я хочу приєднатись 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, !
String.join()
метод, запроваджений на Java 8. Таким чином, величезна кількість людей, які читають цю прийняту відповідь, отримають користь від цих знань. На даний момент найвища відповідь, що згадує цей факт, досить втрачена нижче ...
String.join()
працювало б лише для List<CharSequence>
або CharSequence[]
елементів.
Якщо ви шукали, що використовувати в android, це:
String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)
наприклад:
String joined = TextUtils.join(";", MyStringArray);
У Java 8 ви можете використовувати
1) 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();
}
.append()
два рази для кожного, String
а не об'єднати їх, а потім додати до будівельника.
Як і багато запитань останнім часом, на допомогу 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", "!" };
Тоді як альтернатива відповіді coobird, де клей ",":
Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")
Або об'єднатися з іншим рядком, наприклад "& amp;".
Arrays.asList(a).toString().replaceAll(", ", " & ").replaceAll("^\\[|\\]$", "")
Однак ... цей ТОЛЬКО працює, якщо ви знаєте, що значення масиву чи списку НЕ містять символьну рядок ",".
Arrays.asList(a).toString()
працював над тим, що я хотів зробити
Якщо ви використовуєте Spring Framework, то у вас є клас StringUtils :
import static org.springframework.util.StringUtils.arrayToDelimitedString;
arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");
Не в основі, ні. Пошук "клей для об'єднання рядків java array" дасть вам кілька фрагментів коду, як цього досягти.
напр
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)
і розділяється", "
. Якщо масив є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)));
}
copyOfRange()
").
Нічого вбудованого, що я знаю.
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());
}
StringBuilder
якщо вам потрібна ефективність: P
Якщо ви використовуєте функціональну бібліотеку 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)
s + delimiter
(об'єднання рядків з оператором плюс) перемагає цілі використання a StringBuilder
.
Існує проста методика скорочення, яку я використовую більшість разів ..
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]);
}