konvertiert ArrayList.toString () zurück in ArrayList in einem Aufruf

8

Ich habe eine toString() Repräsentation von ArrayList .

Kopieren Sie den Wert toString() in die Zwischenablage, ich möchte ihn in meinen IDE-Editor kopieren und die Instanz ArrayList in einer Zeile erstellen. Tatsächlich mache ich das wirklich:

  • Meine ArrayList.toString () hat Daten, die ich brauche, um einen Komponententest einzurichten.
  • Ich möchte diese ArrayList.toString () in meinen Editor kopieren, um einen Test gegen diesen Randfall zu erstellen
  • Ich möchte nichts mit der Hand analysieren

Meine Eingabe sieht so aus:

%Vor%

Folgendes funktioniert nicht:

  • Arrays.asList()
  • Google Sammlungen Lists.newArrayList()

Vorschläge?

    
dotnetnewbie 05.05.2010, 14:33
quelle

6 Antworten

20

Teilstring entfernt, Teilen es auf , (Komma und Leerzeichen) und schließlich füttern es Arrays#asList() .

%Vor%

Beachten Sie, dass dies in Ihrem speziellen Fall funktioniert, aber nicht unter allen Umständen. Sie können zum Beispiel eine Liste von Strings haben, von denen mindestens eins ein nachfolgendes Komma und Leerzeichen enthält. Die Aufteilung würde dann fehlschlagen.

    
BalusC 05.05.2010 14:39
quelle
2

Im Allgemeinen enthält der toString() aller Objekte keine Informationen, um das ursprüngliche Objekt ohne weitere Informationen zu reproduzieren.

In Ihrem speziellen Fall könnte das Beispiel von vielen verschiedenen ArrayList -Instanzen (sowie ziemlich allen anderen List Implementierungen, die identische toString() haben) Implementierungen erzeugt werden.

Als extremes Beispiel denken Sie an eine ArrayList , die ein einzelnes Element enthält, nämlich String mit dem Inhalt 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 . Das ArrayList würde genau die gleiche Ausgabe wie Ihre ursprüngliche ArrayList ergeben. Und da zwei verschiedene Eingänge die gleiche Ausgabe erzeugen, kann diese Funktion ohne zusätzliche Informationen nicht umgekehrt werden.

Wenn wir jedoch zusätzliche Informationen haben, z. B. den Inhaltstyp der ursprünglichen ArrayList , wird dies in einigen Fällen möglich. Wenn wir wissen, dass alle Elemente von List vom Typ Double sind, dann ist es eigentlich ziemlich einfach:

%Vor%

Zugegeben, es ist kein One-Liner, aber es ist nicht so schlimm.

    
Joachim Sauer 05.05.2010 14:43
quelle
1

Das funktioniert, aber vielleicht hat jemand etwas eleganteres?

%Vor%     
dotnetnewbie 05.05.2010 14:37
quelle
0
  

Ich möchte das kopieren   ArrayList.toString () in meinen Editor zu   Erstellen Sie einen Test gegen diesen Randfall

Wenn Sie überhaupt kopieren, können Sie nicht einfach Werte kopieren, ohne die eckigen Klammern zu verwenden, und ein

aufrufen %Vor%     
ring bearer 05.05.2010 14:46
quelle
0

Wenn Sie nur nach einer Kopierpastenlösung suchen,

%Vor%

d. Löschen Sie die Anführungszeichen und eckigen Klammern, bevor Sie versuchen, sie in asList () zu setzen. Das sollte Ihnen eine Liste geben, die Sie leicht verwenden können, um eine neue ArrayList zu erstellen.

Wenn die Daten komplizierter als doppelt sind, müssen Sie möglicherweise eine Möglichkeit finden, sie zu parsen.

    
ILMTitan 05.05.2010 14:47
quelle
0

Die Anforderung "Muss eine Zeile sein" stellt sicher, dass Sie ein paar unschöne Ketten von API-Aufrufen erhalten, es sei denn, Sie schreiben eine Hilfsmethode zum Einkapseln von Dingen.

Es ist irgendwie hässlich, aber ähnlich wie dotnetnewbie's Ansatz:

%Vor%

Es ist aus dem Ärmel, so dass ich sicher bin, dass es ein bisschen sauber gemacht werden kann.

Ein eleganterer und einfacher zu lesender Ansatz wäre definitiv, ihn entweder über ein paar Zeilen auszubrechen oder zu einer Hilfsmethode in Ihrem Testfall (oder einer Util-Klasse) umzuformen, die Sie mit Ihrem String aufrufen können gib die gewünschte Ausgabe zurück.

    
Ophidian 05.05.2010 14:48
quelle