Converti array di stringhe in una stringa in Java


242

Voglio il codice Java per convertire una matrice di stringhe in una stringa.


Che tipo di array? Matrice di stringhe?
Adarshr,

2
array.toString()? Sii più preciso.
Stan Kurilin,

1
@Princeyesuraj, la risposta ufficiale è fornita da adarshr . Se si desidera il proprio separatore, è possibile provare la risposta di JoeSlav e, in assenza di problemi di thread, è possibile utilizzare StringBuilder anziché StringBuffer per efficienza. la risposta di Krock è buona, ma secondo me un po 'eccessiva.
Codice Dante Maggio,

Risposte:


470

Se vuoi solo un dump "debug-style" di un array:

String str = Arrays.toString(arr);

o, per un maggiore controllo (prima di Java 8):

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

(Java 8 e versioni successive):

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

E se provieni dal punto di vista Android:

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

Puoi modificare quanto sopra a seconda di quali caratteri vuoi tra le stringhe.

Potresti vedere un codice quasi identico al codice pre-Java 8 ma usando StringBuffer- StringBuilderè una classe più recente che non è thread-safe, ma quindi ha prestazioni migliori in un singolo thread perché elimina la sincronizzazione non necessaria. In breve, stai usando meglio StringBuildernel 99% dei casi - per quanto riguarda la funzionalità, i due sono identici.

NON usare una stringa e aggiungila semplicemente con + = come alcune delle risposte mostrano qui. Questo invia il GC attraverso il tetto perché stai creando e buttando via tutti gli oggetti stringa quanti sono gli elementi nel tuo array. Per array di piccole dimensioni potresti non notare davvero la differenza, ma per quelli di grandi dimensioni può essere più lento di ordini di grandezza.


13
Grazie per la spiegazione del perché StringBuilder è superiore a + = per l'aggiunta.
Nicholas Miller,

5
Se usi + = sotto le copertine Java lo convertirà in StringBuilder.
Javamann,

6
@matteo, devi usare Arrays.toString(yourArray);ma immagino che tu abbia usatoyourArray.toString();
Dzarafata il

5
Da java 1.8puoi anche usare String::join, anziché for-loop. String.join("", arr);
Jorn Vernee,

2
Gli sviluppatori Android possono utilizzare come String result = TextUtils.join (",", list); stackoverflow.com/questions/33802971/...
Rahul Hawge

102

Usa i comuni di Apache StringUtils.join(). Prende un array, come parametro (e ha anche sovraccarichi per Iterablee Iteratorparametri) e chiama toString()ciascun elemento (se non è nullo) per ottenere la rappresentazione di ogni stringa di elementi. Ogni rappresentazione di stringa di elementi viene quindi unita in una stringa con un separatore in mezzo se ne viene specificato uno:

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

produce:

a-b-1

1
correzione minore: joinString = StringUtils.join (nuovo oggetto [] {"a", "b", "1"}, "-");
questborn,

35

Mi piace usare Guava Joiner di Google per questo, ad esempio:

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

produrrebbe la stessa stringa di:

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

ETA: Java 8 ha un supporto simile ora:

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

Non riesco a vedere il supporto per saltare i valori null, ma questo è facilmente aggirabile.


10
Ma se fossimo fedeli alla trama, nullsarebbe "colui il cui nome non deve essere menzionato" :-)
Stephen C

22
Se sei coraggioso: ;-)Joiner.on(", ").useForNull("Voldemort").join("Harry", null, "Ron", "Hermione");
ricco il

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

13

Potresti farlo, dato un array adi tipo primitivo:

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 è vecchio, usa invece StringBuilder che non ha sincronizzazione non necessaria per l'uso in un thread.
Jason S,

13

Da Java 8, il modo più semplice penso sia:

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

In questo modo puoi scegliere un delimitatore arbitrario.


10

Prova il metodo Arrays.deepToString .

Restituisce una rappresentazione in formato stringa dei "contenuti profondi" dell'array specificato. Se l'array contiene altri array come elementi, la rappresentazione in formato stringa contiene il loro contenuto e così via. Questo metodo è progettato per convertire array multidimensionali in stringhe


Se non hai bisogno di molto controllo, credo che questa sia la soluzione più semplice poiché non hai bisogno di una libreria di terze parti. Ecco un esempio: System.out.println (Arrays.deepToString (args));
neves

7

Prova i metodi sovraccarichi Arrays.toString .

Altrimenti, prova questo sotto l'implementazione generica:

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

Quindi dicci il formato che stai cercando. Altrimenti, non possiamo indovinare ciò che hai in mente.
Jason S,

3

Di seguito è riportato un esempio di conversione da array a stringa.

    ArrayToString di classe pubblica
    {
public static void main (String [] args) { 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

Se non hai la scelta, ma per usare Java 6 o 7, dovresti usare il join Divide & Conquer.


0

Vuoi un codice che produca una stringa da arrayList,

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

puoi farlo in 2 modi: usando String come risultato o StringBuffer / StringBuilder.

Esempio:

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

... ma questa non è una buona pratica a causa del motivo delle prestazioni. Meglio usare StringBuffer (thread sicuri) o StringBuilder che sono più appropriati per aggiungere stringhe



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

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

System.out.print(s);

1
La tua risposta è sostanzialmente la stessa di smas; solo un po 'più complicato; quindi sicuramente non "il più facile". Inoltre, Arrays.toString () è ancora più semplice.
GhostCat,

-22

Se sai quanti elementi ha l'array, un modo semplice è farlo:

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

10
Questo è difficilmente applicabile nel mondo reale e mostra alcune cattive pratiche di programmazione.
Jk1

3
Potrebbe essere un'ottima medaglia d'oro per raggiungere -50 negativi
Pablo Cegarra il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.