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

242

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

Princeyesuraj
источник
Что за массив? Массив строк?
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();
JoeSlav
источник
23
StringBuffer старый, используйте вместо него StringBuilder, который не имеет ненужной синхронизации для использования в одном потоке.
Джейсон С
13

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

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

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

Midiparse
источник
10

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

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

SANN3
источник
Если вам не нужно много контроля, я считаю, что это самое простое решение, так как вам не нужна сторонняя библиотека. Вот пример: 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();
}
adarshr
источник
Затем сообщите нам формат, который вы ищете. В противном случае мы не можем угадать, что вы имеете в виду.
Джейсон С
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);
    }
}

parag.rane
источник
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.

Ortreum
источник
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, которые больше подходят для добавления строк

lukastymo
источник
-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 негативов
Пабло Чегарра