Перетворити масив рядків у рядок на Java


242

Я хочу, щоб код Java перетворив масив рядків у рядок.


Який масив? Масив рядків?
adarshr

2
array.toString()? Будьте більш конкретні.
Стен Курілін

1
@Princeyesuraj, офіційну відповідь надає adarshr . Якщо ви хочете мати власний роздільник, ви можете спробувати відповідь JoeSlav , і якщо немає проблем з потоками, ви можете використовувати StringBuilder замість StringBuffer для ефективності. Відповідь Крок хороша, але на мою думку трохи непомітна.
Код Данте Мей

Відповіді:


470

Якщо ви просто хочете скинути масив "debug style":

String str = Arrays.toString(arr);

або, для більшого контролю (до Java 8):

StringBuilder builder = new StringBuilder();
for(String s : arr) {
    builder.append(s);
}
String str = builder.toString();

(Java 8 і вище):

String str = String.join(",", arr);

А якщо ви підходите з кута Android:

String str = TextUtils.join(",", arr);

Ви можете змінити вище, залежно від того, які символи, якщо такі є, ви хочете між рядками.

Ви можете побачити близький до коду попередній Java 8 код, але використання StringBuffer- StringBuilderце новіший клас, який не є безпечним для потоків, але, таким чином, має кращі показники роботи в одному потоці, оскільки він усуває зайву синхронізацію. Коротше кажучи, вам краще використовувати StringBuilderв 99% випадків - функціонально, два є однаковими.

НЕ використовуйте рядок, а просто додайте до нього + +, як показано тут деякі відповіді. Це надсилає GC через дах, тому що ви створюєте та викидаєте стільки об’єктів, що мають рядок, скільки у вас є елементів у масиві. Для малих масивів ви можете не помітити різниці, але для великих вони можуть бути на порядок повільнішими.


13
Дякуємо за пояснення, чому StringBuilder перевершує + = для додавання.
Ніколас Міллер

5
Якщо ви використовуєте + = під обкладинками, Java перетворить це на використання StringBuilder.
Javamann

6
@matteo, Ви повинні використовувати, Arrays.toString(yourArray);але я думаю, ви використовувалиyourArray.toString();
Dzarafata

5
Оскільки java 1.8ви можете також використовувати String::joinзамість for-петлі. String.join("", arr);
Йорн Верні

2
Розробники Android можуть використовувати як String result = TextUtils.join (",", list); stackoverflow.com/questions/33802971 / ...
Рахул Hawge

102

Використовуйте спільноти Apache StringUtils.join(). Він приймає масив як параметр (а також має перевантаження для Iterableта Iteratorпараметрів) та викликає toString()кожен елемент (якщо він не є нульовим), щоб отримати представлення рядків кожного елемента. Кожне представлення рядка елементів об'єднується в одну рядок з роздільником між ними, якщо вказано таке:

String joinedString = StringUtils.join(new Object[]{"a", "b", 1}, "-");
System.out.println(joinedString);

Виробляє:

a-b-1

1
незначне виправлення: joinedString = StringUtils.join (новий Object [] {"a", "b", "1"}, "-");
квест,

35

Мені подобається використовувати для цього Guava Joiner від Google , наприклад:

Joiner.on(", ").skipNulls().join("Harry", null, "Ron", "Hermione");

створив би ту саму рядок, що і:

new String("Harry, Ron, Hermione");

ETA: Java 8 вже має подібну підтримку:

String.join(", ", "Harry", "Ron", "Hermione");

Не вдається підтримка пропуску нульових значень, але це легко обробити.


10
Але якби ми були вірними сюжету, nullбув би "той, чиє ім'я не повинно згадуватися" :-)
Стівен C

22
Якщо ви хоробрі: ;-)Joiner.on(", ").useForNull("Voldemort").join("Harry", null, "Ron", "Hermione");
багатий

Використання java-8String.join(", ", "Harry", null, "Ron", "Hermione").replaceAll("null", "Voldermart");
Cjo

13

Ви можете зробити це, задавши масив aпримітивного типу:

StringBuffer result = new StringBuffer();
for (int i = 0; i < a.length; i++) {
   result.append( a[i] );
   //result.append( optional separator );
}
String mynewstring = result.toString();

23
StringBuffer старий, замість цього використовуйте StringBuilder, який не має зайвої синхронізації для використання в одному потоці.
Jason S

13

З Java 8 найпростіший спосіб, на який я думаю:

    String[] array = { "cat", "mouse" };
    String delimiter = "";
    String result = String.join(delimiter, array);

Таким чином можна вибрати довільний роздільник.


10

Спробуйте метод Arrays.deepToString .

Повертає рядкове подання "глибокого вмісту" зазначеного масиву. Якщо масив містить інші масиви як елементи, представлення рядків містить їх вміст тощо. Цей метод призначений для перетворення багатовимірних масивів у рядки


Якщо вам не потрібно багато контролю, я вважаю, що це найпростіше рішення, оскільки вам не потрібна стороння вкладка. Ось приклад: System.out.println (Arrays.deepToString (args));
neves

7

Спробуйте Arrays.toString перевантажені методи .

Або ж спробуйте це нижче загальної реалізації:

public static void main(String... args) throws Exception {

    String[] array = {"ABC", "XYZ", "PQR"};

    System.out.println(new Test().join(array, ", "));
}

public <T> String join(T[] array, String cement) {
    StringBuilder builder = new StringBuilder();

    if(array == null || array.length == 0) {
        return null;
    }

    for (T t : array) {
        builder.append(t).append(cement);
    }

    builder.delete(builder.length() - cement.length(), builder.length());

    return builder.toString();
}

Тоді скажіть нам потрібний формат. Інакше ми не можемо здогадатися, що ви маєте на увазі.
Jason S

3

Далі наводиться приклад перетворення масиву в рядок.

    публічний клас ArrayToString
    {
public static void main (String [] аргументи) { String [] strArray = new String [] {"Java", "PHP", ".NET", "PERL", "C", "COBOL"};

        String newString = Arrays.toString(strArray);

        newString = newString.substring(1, newString.length()-1);

        System.out.println("New New String: " + newString);
    }
}


1
String[] strings = new String[25000];
for (int i = 0; i < 25000; i++) strings[i] = '1234567';

String result;
result = "";
for (String s : strings) result += s;
//linear +: 5s

result = "";
for (String s : strings) result = result.concat(s);
//linear .concat: 2.5s

result = String.join("", strings);
//Java 8 .join: 3ms

Public String join(String delimiter, String[] s)
{
    int ls = s.length;
    switch (ls)
    {
        case 0: return "";
        case 1: return s[0];
        case 2: return s[0].concat(delimiter).concat(s[1]);
        default:
            int l1 = ls / 2;
            String[] s1 = Arrays.copyOfRange(s, 0, l1); 
            String[] s2 = Arrays.copyOfRange(s, l1, ls); 
            return join(delimiter, s1).concat(delimiter).concat(join(delimiter, s2));
    }
}
result = join("", strings);
// Divide&Conquer join: 7ms

Якщо у вас немає вибору, але використовувати Java 6 або 7, тоді ви повинні використовувати Divide & Conquer join.


0

Ви хочете код, який створює рядок з arrayList,

Iterate through all elements in list and add it to your String result

це можна зробити двома способами: використовуючи String як результат або StringBuffer / StringBuilder.

Приклад:

String result = "";
for (String s : list) {
    result += s;
}

... але це не є хорошою практикою через ефективність роботи. Краще використовувати StringBuffer (безпечний для потоків) або StringBuilder, який більше підходить для додавання рядків



-1
String array[]={"one","two"};
String s="";

for(int i=0;i<array.length;i++)
{
  s=s+array[i];
}

System.out.print(s);

1
Ваша відповідь в основному така ж, як smas; просто трохи складніше; таким чином впевнений, що не "найпростіший". А крім того, Arrays.toString () ще простіше.
GhostCat

-22

Якщо ви знаєте, скільки елементів має масив, це простий спосіб:

String appendedString = "" + array[0] + "" + array[1] + "" + array[2] + "" + array[3]; 

10
Це навряд чи можна застосувати в реальному світі і показує деякі погані практики програмування.
Jk1

3
Може бути чудовою золотою медаллю за досягнення -50 негативів
Пабло Чегарра
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.