2011-10-21 44 views
7

Questa è una domanda abbastanza semplice. Quando si stampa un LinkedList, in questo modo:Java: stampa lista collegata senza parentesi quadre?

System.out.println(list); 

Esso stampa fuori, che circonda la lista tra parentesi quadre come questo:

[thing 1, thing 2, thing 3] 

C'è un modo per stampare senza la piazza parentesi?

risposta

21

Sì - iterare l'elenco e stamparlo (con una virgola dopo ciascuna, ma l'ultimo elemento). Tuttavia, ci sono utils per aiutare:

Guava:

String result = Joiner.on(", ").join(list); 

commons-lang:

String result = StringUtils.join(list, ", "); 

E una nota: non si basano sul metodo di qualsiasi oggetto .toString(). Non è pensato per mostrare l'oggetto agli utenti, o per essere usato come formato predefinito - è pensato principalmente per scopi di debug.

+1

Questo ha bisogno di +2 per le utilità e il bit 'toString()'. –

+0

Qual è l'importazione per StringUtils? – Blackvein

+0

Nevermind ho trovato :) Grazie ragazzi! – Blackvein

5

Una risposta rapida-and-dirty è:

String s = list.toString(); 
System.out.println(s.substring(1, s.length()-1)); 
+2

Dal momento che hai incluso il disclaimer "veloce e sporco", ho non prevaricherà la tua risposta. Detto questo, questo è esattamente il tipo di cose che dovremmo essere * scoraggiando * altri sviluppatori dal fare. –

0

Questa è l'implementazione predefinita del toString() su LinkedList. È possibile estendere LinkedList per fornire la propria implementazione o utilizzare la composizione e implementare semplicemente l'interfaccia java.util.List.

public class MyLinkedList<E> implements List<E> 
{ 
    private final List<E> delegate; 

    public MyLinkedList(List<E> list) 
    { 
     delegate = list; 
    } 

    /** 
    * @return see overriden class or implemented interface 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() 
    { 
     return "My special toString() method"; 
    } 

    // implement rest of the java.util.List interface 
2

Si potrebbe sottoclasse LinkedList e sovrascrivere è toString() metodo, ma che sembra un po 'eccessivo. Invece, itera su di esso e costruisci uno String con uno StringBuilder o uno StringBuffer (se la concorrenza è un problema).

Nota:
vi consiglio di non seguire la risposta fornita da @Sean Owen, dato che è l'attuazione-dipendente e, quindi, fragile.

0

Modificato da AbstractCollection.java:

/* 
    * @return a string representation of a collection 
    */ 
    public static final String collectionToString(Collection c) { 
     Iterator<E> it = c.iterator(); 
     if (! it.hasNext()) 
      return ""; 

     StringBuilder sb = new StringBuilder(); 
     for (;;) { 
      E e = it.next(); 
      sb.append(e == c ? "(this Collection)" : e); 
      if (! it.hasNext()) 
       return sb.toString(); 
      sb.append(',').append(' '); 
     } 
    } 
0
StrBuilder builder = new StrBuilder(); // apache commons lang. 
for (Object object : yourList) 
{ 
    builder.appendSeperator(", "); 
    builder.append(object.toString()); 
} 

System.out.println(builder.toString()); 
0

È possibile afferrare la stringa restituita dal metodo .toString() e rimuovere il primo e l'ultimo carattere, o fare la propria classe lista e sovrascrivere il metodo .toString() per scorrere la lista e stampare gli elementi senza parentesi. Oppure puoi farlo come una classe anonima come:

List<String> list = new List<String>() { 
    public String toString() { 
     // Custom To String Stuff Here 
    } 
}; 

E ovviamente sono troppo lento.

0

Se siete in Groovy, non c'è bisogno di importare nulla, basta fare:

list = ["thing 1", "thing 2", "thing 3"]  
println list.collect { i -> "$i" }.join(', ') 

cosa 1, cosa 2, cosa 3


Lo stesso vale per la collezione di mappe:

map = [I:"James Bond", love:"rock N roll", id:"007"] 
println map.collect { k,v -> "$k = $v" }.join('\n') 

I = James Bond

rullo amore = roccia N

id = 007

Problemi correlati