2011-10-21 41 views
7

Esta es una pregunta bastante simple. Al imprimir un LinkedList, así:Java: ¿Imprimir LinkedList sin corchetes?

System.out.println(list); 

Imprime a cabo, que rodea a la lista entre corchetes de esta manera:

[thing 1, thing 2, thing 3] 

¿Hay alguna manera de que pueda imprimirlo sin la plaza ¿soportes?

Respuesta

21

Sí, itere la lista e imprímala (con una coma después de cada uno, pero el último elemento). Sin embargo, existen utilidades para ayudar:

Guava:

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

commons-lang:

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

Y una nota: no se basan en el método de cualquier objeto .toString(). No está destinado a mostrar el objeto a los usuarios, o para ser utilizado como un formato predefinido, está destinado principalmente a la depuración.

+1

Este necesita +2 para las utilidades y el bit 'toString()'. –

+0

¿Cuál es la importación de StringUtils? – Blackvein

+0

No importa, lo encontré :) ¡Gracias chicos! – Blackvein

5

Una respuesta rápida y sucia-es:

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

Desde que incluyó la renuncia "rápida y sucia", me no rechazará tu respuesta. Dicho esto, este es exactamente el tipo de cosas que deberíamos estar * desalentando * a otros desarrolladores. –

0

Esta es la implementación predeterminada de los métodos toString() en LinkedList. Puede extender LinkedList para proporcionar su propia implementación o composición de uso y simplemente implementar la interfaz 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

Usted podría subclase LinkedList y anular es toString() método, pero que parece un poco excesivo. En su lugar, itere sobre sus elementos y construya un String con un StringBuilder, o un StringBuffer (si la concurrencia es un problema).

Nota:
le sugiero que no sigue la respuesta proporcionada por @Sean Owen, ya que es dependiente de la implementación y, por tanto, frágil.

0

Modificado de 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

se puede agarrar la cadena devuelta por el método .toString() y quitar el primer y último carácter, o hacer su propia clase lista y reemplazar el método .toString() para recorrer la lista e imprime los elementos sin los corchetes. O puede hacerlo como una clase anónima como:

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

Y, por supuesto, soy demasiado lento.

0

Si usted está en maravilloso, no hay necesidad de importar nada, sólo hacer:

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

cosa 1, cosa 2, cosa 3


Lo mismo ocurre con la colección de mapas:

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

I = James Bond

rollo de amor = roca N

id = 007