2010-05-05 5 views
8

Ho una rappresentazione toString() di un ArrayList.convertire ArrayList.toString() indietro in ArrayList in una chiamata

Copia il valore toString() negli appunti, voglio copiarlo nel mio editor IDE e creare l'istanza ArrayList in una riga. Infatti, quello che sto facendo è questo:

  • my ArrayList.toString() ha i dati che ho bisogno di impostare un test di unità.
  • voglio copiare questo ArrayList.toString() nel mio editore per costruire una prova contro questo caso limite
  • non voglio analizzare nulla a mano

mio ingresso si presenta così:

[15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16]

La seguente non funziona:

  • Arrays.asList()
  • collezioni google Lists.newArrayList()

Suggerimenti?

+2

Potete specificare perché Arrays.asList (15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16) non è stato in grado di fornire un elenco corretto? – Riduidel

+0

l'ho scelto arbitrariamente. Mi dispiace, hai ragione su questo. la mia lista delle prove è stata di stringhe: "[x, y, z]" – dotnetnewbie

risposta

1

questo funziona, ma forse qualcuno ha qualcosa di più elegante?

List<String> list = Lists.newArrayList(Splitter.on(",").omitEmptyStrings().split("JUN10, SEP10, DEC10, MAR11, JUN11, SEP11, DEC11, MAR12, JUN12, SEP12, DEC12, MAR13, DEC13, DEC14")); 
    assertEquals(14, list.size()); 
+0

ha dovuto rimuovere le parentesi dall'inizio e dalla fine di ArrayList.toString() – dotnetnewbie

+0

Sembra che tu stia usando Spltter dalle librerie guava – harschware

+0

yep - Lists.newArrayList proviene da google anche – dotnetnewbie

20

Substring le parentesi distanza, split su , (virgola e spazio) e infine alimentarlo a Arrays#asList().

String s = "[15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16]"; 
List<String> list = Arrays.asList(s.substring(1, s.length() - 1).split(", ")); 

Nota che questo funzionerà nel tuo caso particolare, ma non in tutte le circostanze. Ad esempio, puoi avere un elenco di stringhe di cui almeno una contiene una successiva virgola e spazio. La divisione fallirebbe quindi.

+2

Penso che tu voglia s.length() - 1, dato che il carattere alla fineIndex non è incluso nella sottostringa – Ophidian

+0

solo per questioni personali, ma preferisco non analizzare e preferire la soluzione splitter di google. – dotnetnewbie

+0

La tua scelta. Volevo solo dimostrare che * funziona *. Lei ha menzionato che "non funziona". Dato che hai già fornito la risposta utilizzando Google Collections in anticipo, non volevo perdere tempo a duplicarlo. – BalusC

2

In generale, lo toString() di qualsiasi oggetto non contiene informazioni per riprodurre l'oggetto originale senza ulteriori informazioni.

Nel vostro caso specifico l'esempio potrebbe essere prodotto da molte differenti ArrayList casi (così come praticamente tutti gli altri List implementazioni che hanno identiche toString()) implementazioni.

Come esempio estremo, si consideri un ArrayList che contiene un singolo elemento che è il String con il contenuto 15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16. Che ArrayList produca esattamente la stessa uscita dell'originale ArrayList. E poiché due diversi input producono lo stesso output, non è possibile invertire questa funzione senza ulteriori informazioni.

Se, tuttavia, disponiamo di informazioni aggiuntive, come il tipo di contenuto dell'originale ArrayList, in alcuni casi diventa possibile.Se sappiamo che tutti gli elementi del List erano di tipo Double, quindi è in realtà piuttosto semplice:

public static List<Double> stringToList(final String input) { 
    String[] elements = input.substring(1, input.length() - 1).split(", "); 
    List<Double> result = new ArrayList<Double>(elements.length); 
    for (String item : elements) { 
     result.add(Double.valueOf(item)); 
    } 
    return result; 
} 

Certo, non è una battuta, ma non è troppo male.

0

voglio copiare questo ArrayList.toString() nel mio editore a costruire una prova contro questo caso limite

Se a tutto si copia, non puoi semplicemente copiare valori omettendo le parentesi quadre e chiamare un

Arrays.asList(...) ? 
+0

sì - ho modificato. scusa. i valori di tipo Numero funzionano bene; ma che dire quando la tua lista ha elementi di stringa? – dotnetnewbie

+0

@dotnetnewbie: gli elementi stringa funzioneranno sempre se nessuno degli elementi String contiene la sottostringa '", "'. –

+0

il punto in cui si esercita è quello di copiare e incollare nel test dell'unità e ottenere il funzionamento dell'unità test con il minimo percorso di resistenza presumendo di avere un ArrayList.toString() che è possibile copiare negli appunti da IDE – dotnetnewbie

0

Se siete solo in cerca di una soluzione di copia incolla,

Arrays.asList(15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16); 

, ad esempio eliminare le virgolette e le parentesi quadre prima di provare a inserirlo in asList(). Questo dovrebbe darti una lista che potresti facilmente usare per creare un nuovo ArrayList.

Se i dati sono più complicati del doppio, potrebbe essere necessario trovare un modo per analizzarli.

+0

P.S. i dati sono la forma singolare di dati. – ILMTitan

+0

Ciao ILMTitan, mi piace, ma non funziona quando l'elenco ha elementi stringa cioè "[x, y, z]" – dotnetnewbie

0

Il requisito "deve essere una riga" garantisce quasi sicuramente un brutto pasticcio di chiamate API concatenate, a meno che non si scriva un metodo di supporto per incapsulare le cose.

È un po 'brutto, ma simile approccio di per dotnetnewbie:

List<String> result = Arrays.asList(listString.substring(1, listString.length()-1).split(",\\s*")); 

E' a braccio, quindi sono sicuro che può essere ripulito un bel po '.

Un approccio più elegante e più facile da leggere sarebbe sicuramente quello di scomporlo su un paio di linee o refactoring per un metodo di supporto nel tuo caso di test (o una classe Util) che puoi chiamare con la tua stringa e avere restituisce l'output che desideri.