2010-03-24 13 views
10

Così ho essenzialmente bisogno di fare questo:Esiste un modo semplice per concatenare più righe di testo in una stringa senza aggiungere continuamente una nuova riga?

String text = "line1\n"; 
text += "line2\n"; 
text += "line3\n"; 
useString(text); 

V'è più coinvolto, ma questo è l'idea di base. C'è qualcosa là fuori che potrebbe lasciarmi fare qualcosa di più sulla falsariga di questo però?

DesiredStringThinger text = new DesiredStringThinger(); 
text.append("line1"); 
text.append("line2"); 
text.append("line3"); 
useString(text.toString()); 

Ovviamente, non ha bisogno di lavorare esattamente così, ma penso che ottengo il punto fondamentale in tutto. C'è sempre la possibilità di scrivere un ciclo che elabora il testo da solo, ma sarebbe bello se esistesse una classe Java standard che già fa qualcosa di simile a questo piuttosto che a me che devo tenere una lezione tra le applicazioni solo così posso fare qualcosa di così banale.

Grazie!

risposta

15

è possibile utilizzare un StringWriter avvolto in un PrintWriter:

StringWriter stringWriter = new StringWriter(); 
PrintWriter writer = new PrintWriter(stringWriter, true); 
writer.println("line1"); 
writer.println("line2"); 
writer.println("line3"); 
useString(stringWriter.toString()); 
+1

+1, non sapevo su 'StringWriter' – missingfaktor

+0

Grazie, mi ha aiutato .. –

9

AFAIK non esiste una classe di libreria che consenta di farlo.

Quanto segue fa il lavoro però:

class DesiredStringThinger { 
    StringBuilder text = new StringBuilder(); 

    public void append(String s) { text.append(s).append("\n"); } 

    @Override 
    public String toString() { return text.toString(); } 
} 
+0

Se corretto, ciò causerà problemi di prestazioni con un numero relativamente piccolo di righe: la soluzione di Roman è molto migliore in questo senso. –

+0

Solo un consiglio: usa la stringa 'lsp = System.getProperty ("line.separator") di Roman; ma dichiaralo come membro statico privato – Yaneeve

+2

@Tomislav: Come? – missingfaktor

5
public String createString() { 
    StringBuilder sb = new StringBuilder(); 
    String txt = appendLine("firstline", sb).appendLine("2ndLine", sb).toString(); 
} 

private StringBuilder appendLine (String line, StringBuilder sb) { 
    String lsp = System.getProperty("line.separator"); 
    return sb.append (line).append (lsp); 
} 
2

È possibile utilizzare uno StringBuffer

StringBuffer text = new StringBuffer(); 
text.append("line1"); 
text.append("line2"); 
... 
useString(text.toString()); 

Questo non aggiungerà il carattere di nuova riga, ma si può certamente aggiungere che pure per ogni linea.

+1

Penso che Marshmellow1328 voglia una nuova linea tra ogni token quando append() si chiama –

+0

Questo è il punto in cui ho iniziato, quindi mi sono stancato di aggiungere il carattere di nuova riga per ogni riga. per farlo, speravo che potesse esserci qualcosa che esiste già là fuori piuttosto che dover espandere la mia libreria java di base – Marshmellow1328

1

Forse il metodo più basso impatto è quello di aggiungere un metodo statico per aggiungere una nuova linea per un StringBuilder.

public static StringBuilder appendln(StringBuilder buff, String str) { 
    return buff.append(str).append('\n'); 
} 

Ma @Joachim Sauer mi batte alla mia soluzione preferita. Per esempi più complessi potresti voler utilizzare il tuo decoratore Writer come @Rahul G (usa solo campi privati).

1

Se non siete pazzi per le prestazioni, penso che sia pulito e ordinato.

class DesiredStringThinger { 
    StringBuilder sb = new StringBuilder(); 

    public void concat(String... s) { 
     for(String str : s){ 
     sb.append(s).append("\n"); 
     } 
    } 

    @Override 
    public String toString() { 
     return sb.toString(); 
    } 
} 
3

È possibile utilizzare da Apache Commons l'helper StringUtils.join. Che permette di costruire una stringa da una lista. Puoi aggiungere il carattere/stringa "delimitatore".

2

Se si desidera utilizzare librerie esterne, controllare lo Joiner in Guava.

Il tuo codice sarebbe andato a qualcosa di simile

String result = Joiner.on("\n").join(parts); 

dove parts è un Iterable<String>.

Problemi correlati