Konwertuj tablicę ciągów na ciąg w Javie


242

Chcę kodu Java do konwersji tablicy ciągów na ciąg.


Jaki rodzaj tablicy? Tablica ciągów?
adarshr

2
array.toString()? Uszczegółów.
Stan Kurilin,

1
@Princeyesuraj, oficjalną odpowiedź zapewnia adarshr . Jeśli chcesz mieć własny separator, możesz wypróbować odpowiedź JoeSlava , a jeśli nie ma problemu z wątkiem, możesz użyć StringBuilder zamiast StringBuffer w celu zwiększenia wydajności . Odpowiedź Krocka jest dobra, ale moim zdaniem trochę przesadzona.
Dante May Code

Odpowiedzi:


470

Jeśli chcesz tylko zrzutu tablicy w stylu „debugowania”:

String str = Arrays.toString(arr);

lub, dla większej kontroli (przed Java 8):

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

(Java 8 i nowsze):

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

A jeśli pochodzisz z Androida:

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

Możesz zmodyfikować powyższe w zależności od tego, jakie znaki, jeśli jakieś, chcesz pomiędzy ciągami.

Możesz zobaczyć prawie identyczny kod z kodem wcześniejszym niż Java 8, ale używając StringBuffer- StringBuilderto nowsza klasa, która nie jest bezpieczna dla wątków, ale dlatego ma lepszą wydajność w jednym wątku, ponieważ eliminuje niepotrzebną synchronizację. Krótko mówiąc, lepiej jest używaćStringBuilder w 99% przypadków - pod względem funkcjonalności oba są identyczne.

NIE używaj ciągu znaków i po prostu dołącz do niego znak + =, tak jak pokazano niektóre odpowiedzi. To wysyła GC przez dach, ponieważ tworzysz i wyrzucasz tyle obiektów łańcuchowych, ile masz elementów w tablicy. W przypadku małych tablic różnica może nie być zauważalna, ale w przypadku dużych tablice mogą być wolniejsze o rząd wielkości.


13
Dziękujemy za wyjaśnienie, dlaczego StringBuilder jest lepszy od + = przy dołączaniu.
Nicholas Miller

5
Jeśli użyjesz + = pod przykryciem, Java przekonwertuje to na użycie StringBuilder.
Javamann,

6
@ matteo, musisz użyć, Arrays.toString(yourArray);ale chyba użyłeśyourArray.toString();
Dzarafata

5
Ponieważ java 1.8można również używać String::joinzamiast pętli for. String.join("", arr);
Jorn Vernee

2
Programiści systemu Android mogą korzystać z funkcji String wynik = TextUtils.join („,”, list); stackoverflow.com/questions/33802971/…
Rahul Hawge

102

Użyj wspólnego Apache StringUtils.join(). Pobiera tablicę jako parametr (a także przeciążenia Iterablei Iteratorparametry) i wywołuje toString()każdy element (jeśli nie jest pusty), aby uzyskać reprezentację ciągu każdego elementu. Reprezentacja ciągu każdego elementu jest następnie łączona w jeden ciąg z separatorem pomiędzy nimi, jeśli jest określony:

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

Produkuje:

a-b-1

1
drobna poprawka: joinString = StringUtils.join (new Object [] {„a”, „b”, „1”}, „-”);
questborn

35

Lubię do tego używać Google Guava Joiner , np .:

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

wytworzy taki sam ciąg znaków jak:

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

ETA: Java 8 ma teraz podobne wsparcie:

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

Nie widzę obsługi pomijania wartości zerowych, ale łatwo to obejść.


10
Gdybyśmy jednak byli wierni fabule, nullto byłby „ten, którego imienia nie wolno wymieniać” :-)
Stephen C

22
Jeśli jesteś odważny: ;-)Joiner.on(", ").useForNull("Voldemort").join("Harry", null, "Ron", "Hermione");
bogaty

Korzystanie z java-8String.join(", ", "Harry", null, "Ron", "Hermione").replaceAll("null", "Voldermart");
Cjo

13

Możesz to zrobić, biorąc pod uwagę tablicę atypu pierwotnego:

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 jest stary, zamiast tego użyj StringBuilder, który nie ma niepotrzebnej synchronizacji do użycia w jednym wątku.
Jason S

13

W Javie 8 najprostszym sposobem jest:

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

W ten sposób możesz wybrać dowolny ogranicznik.


10

Wypróbuj Arrays.deepToString metodę .

Zwraca ciąg znaków reprezentujący „głęboką zawartość” określonej tablicy. Jeśli tablica zawiera inne tablice jako elementy, reprezentacja ciągu zawiera ich zawartość i tak dalej. Ta metoda jest przeznaczona do konwertowania wielowymiarowych tablic na ciągi


Jeśli nie potrzebujesz dużej kontroli, uważam, że jest to najprostsze rozwiązanie, ponieważ nie potrzebujesz biblioteki innej firmy. Oto przykład: System.out.println (Arrays.deepToString (args));
neves

7

Wypróbuj metody przeciążone Arrays.toString .

Albo spróbuj tego poniżej ogólnej implementacji:

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

Następnie powiedz nam, jakiego formatu szukasz. W przeciwnym razie nie możemy zgadnąć, co masz na myśli.
Jason S,

3

Poniżej znajduje się przykład konwersji z tablicy na ciąg znaków.

    ArrayToString klasy publicznej
    {
public static void main (Argumenty 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

Jeśli nie masz wyboru, ale używasz Java 6 lub 7, powinieneś użyć łączenia Divide & Conquer.


0

Chcesz kodu, który tworzy ciąg znaków z arrayList,

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

możesz to zrobić na 2 sposoby: używając String jako wyniku lub StringBuffer / StringBuilder.

Przykład:

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

... ale nie jest to dobra praktyka ze względu na wydajność. Lepiej jest używać StringBuffer (wątki bezpieczne) lub StringBuilder, które są bardziej odpowiednie do dodawania ciągów



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

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

System.out.print(s);

1
Twoja odpowiedź jest w zasadzie taka sama jak smas; tylko trochę bardziej skomplikowane; dlatego na pewno nie „najłatwiejszy”. A poza tym Arrays.toString () jest jeszcze łatwiejszy.
GhostCat,

-22

Jeśli wiesz, ile elementów ma tablica, możesz to zrobić w prosty sposób:

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

10
To nie ma zastosowania w prawdziwym świecie i pokazuje pewne złe praktyki programowania.
Jk1

3
Może być świetny złoty medal za osiągnięcie -50 negatywów
Pablo Cegarra
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.