Конвертировать массив строк в строку в Java


242

Я хочу код Java для преобразования массива строк в строку.


Что за массив? Массив строк?
adarshr

2
array.toString()? Более конкретно.
Стан Курилин

1
@Princeyesuraj, официальный ответ предоставлен adarshr . Если вы хотите собственный разделитель, вы можете попробовать JoeSlav ответ «S, и если нет проблем нити, вы можете использовать StringBuilder вместо StringBuffer для практичности. Ответ Крока хорош, но, на мой взгляд, немного излишним.
Данте Мэй Код

Ответы:


470

Если вы просто хотите получить дамп массива в стиле отладки:

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();
Дзарафата

5
С Java 1.8вы также можете использовать String::joinвместо цикла for. String.join("", arr);
Йорн Верни

2
Разработчики Android могут использовать как String result = TextUtils.join (",", list); stackoverflow.com/questions/33802971/…
Рахул Хоге

102

Используйте Apache Commons StringUtils.join(). Он принимает массив в качестве параметра (а также имеет перегрузки для Iterableи Iteratorпараметров) и вызывает toString()каждый элемент (если он не нулевой), чтобы получить строковое представление каждого элемента. Каждое строковое представление элементов затем объединяется в одну строку с разделителем между ними, если он указан:

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

Производит:

a-b-1

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

35

Мне нравится использовать Google Guava Joiner для этого, например:

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, который не имеет ненужной синхронизации для использования в одном потоке.
Джейсон С

13

Начиная с Java 8, я думаю, что проще всего:

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

Таким образом, вы можете выбрать произвольный разделитель.


10

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

Возвращает строковое представление "глубокого содержимого" указанного массива. Если массив содержит другие массивы в качестве элементов, строковое представление содержит их содержимое и так далее. Этот метод предназначен для преобразования многомерных массивов в строки


Если вам не нужно много контроля, я считаю, что это самое простое решение, так как вам не нужна сторонняя библиотека. Вот пример: System.out.println (Arrays.deepToString (args));
Невес

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();
}

Затем сообщите нам формат, который вы ищете. В противном случае мы не можем угадать, что вы имеете в виду.
Джейсон С

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.