Frage

Vielleicht gibt es ein Verfahren, das dies tut, dass ich weiß nicht, über - ich bezweifle es aber - aber ich versuche, ein Array von Strings zu einem Array von Objekten zu konvertieren. Hier ist das Problem: Ich bin eine Datei in der Befehlszeile zu lesen. Die Datei stellt mehrere Klassen der folgenden Typen mit jeweils eigenen Datenfeldern. Fahrzeug ist die Elternklasse aller, die folgen: Fahrzeug, Auto, amerikanisches Auto, Außen Auto, LKW, Fahrrad.

Ich habe kein Problem, die Datei in ein String-Array zu lesen. Allerdings brauche ich Objekte von all diesen Typen erstellen und speichern sie in einem Array vom Typ Fahrzeug []. Zum Beispiel kann ein Teil der Datei wie folgt aussieht:

  • Fahrzeug
  • Kim Stanley Robinson
  • 2344 Gericht Laufwerk
  • (221) 885-7777
  • stackoverflow@overflow.com
  • American Car
  • John Bunyon
  • 1010 binäre Spur
  • (221) 885-55643
  • bgt.com
  • konvertierbar
  • gemacht in detroit
  • union Anlage

Wo Klassentyp ist die erste Zeile, gefolgt von, Namen des Besitzers, Adresse, Telefonnummer, E-Mail-Adresse ... Jeder Typ hat Felder insbesondere darauf. So ein fremdes Auto in Detroit nicht gemacht. Jedes dieser Felder erscheinen in einer separaten Zeile in der Datei. Also, was ich getan habe, wird die gesamte Datei in eine String-Array lesen. Allerdings muss ich meine Typen im Array von Strings finden, erstellen Objekte dieser Typen, und speichern sie in einem Fahrzeug-Array. Mein Hauptproblem ist, dass jedes Datenfeld in einer separaten Zeile ist. Wie soll ich mich wenden, dieses Problem? Dies ist Java-Code durch die Art und Weise.

War es hilfreich?

Lösung

Am Anfang der Daten in ein String-Array zu lesen ist in Ordnung. Dann müssen Sie eine Schleife durch das Array, und auf der Grundlage der „erste Zeile“ jede Schleife ( „Fahrzeug“, „American Auto“ usw.), werden Sie wissen, wie viele nachfolgende Elemente des Arrays zu derselben gehören.

So etwas (ich werde dich in den freien Räumen selbst lassen füllen)

int i = 0;
ArrayList<vehicle> vehicles = new ArrayList();
while (i < data.length)
{
  if (data[i].equalsIgnoreCase("vehicle"))
  {
    Vehicle vehicle = new Vehicle();
    vehicle.setOwner(data[++i]);
    ...
    vehicles.add(vehicle);
  }
  else if (data[i].equalsIgnoreCase("american car"))
  {
    ...
  }
  i++;
}

Andere Tipps

Frage ist unklar. Möchten Sie wissen wollen, wie die Datei zu analysieren und die Worte in jeder Zeile verwenden, um ein Objekt davon zu erstellen?

pseudo:

Vehicle_ptr myVeh = null;
for each line in file
switch line
{
case vehicle: myVeh = new Vehicle();
case American Car : myVeh = new AmericanCar();
default:
if (line.startswithaninteger && (myVeh != NULL)) myVeh.address = line;
etcetc.
}

Tipps: Verwendung typeidentifiers im textfile.for Beispiel: Auto: americancar Adresse: 12345 bla etcetc

oder einen Serializer verwenden

Sie können die Datei lesen, wie Sie gerade jetzt tun, aber wenn Sie einen String gelesen, dass ein Klassentyp ist eine Instanz des richtigen Fahrzeugtypen erstellen. Es scheint, dass Sie würde dann wissen, dass die nächsten x Zeilen der Datei sind Eigenschaften dieser besonderen Art, so dass Sie die Eigenschaften lesen würden und sie auf Ihrem Fahrzeug Instanz festgelegt. Sie haben dann Ihr Fahrzeug Instanz an den Fahrzeug-Array hinzuzufügen.

Ich würde ein Factory-Muster verwenden, die Adapter erzeugt. Die Fabrik würde die Schnur (Vehicle, American Car) und der Adapter das String-Array und aktuellen Index würde. Der Adapter wäre verantwortlich zu wissen, wie viele Indizes den konkreten Gegenstand zu lesen und zurück (oder eine Schnittstelle).

IAdapter adapter = AdapterFactory.Create( "American Car" );
Object concreteObject = adapter.Popluate( stringArray, currentIndex );

Nun, wenn Sie Kontrolle darüber, wie die Daten gespeichert sind, könnten Sie in Standard-Serialisierung aussehen wollen, auch JSON, die Verarbeitung zu erleichtern.

Es scheint mir, benötigen Sie ein Fabrik Muster Ihr Satz von Fahrzeugtypen zu bauen aus die Eingänge. Die Fabrik kann schauen nach der Bestimmung, wo ein Auto-Spezifikation beginnt und eine andere endet. Es wird dann die Menge von Feldern für ein Auto bestimmen und den Fahrzeugtyp bestimmen. Es kann dann den entsprechenden Konstruktor aufrufen, in allen verwandten Bereichen übergeben.

Das bedeutet, dass ein Konstruktor von (sagen wir) einem amerikanischen Auto alle Felder an, die es interessiert ist. Eine europäische Autobauer würde das gleiche tun. Jeder Konstruktor kann auf behaupten, was es gegeben worden, so dass Sie keine Autos falsch erstellen.

Die Fabrik wird sich nach dem Parsen und die Eingänge zu trennen und zu bestimmen, was gebaut werden soll. Jede Art von Auto Konstruktor sieht nach Informationen für das Auto nur und führt die entsprechenden behauptet.

Die Fabrik wird die Liste der Autos erstellt, pflegen und bring diese Liste (von Amerika / Europäischem / Japanisch) nach Abschluss.

In Pseudo-Code:

whilst(!done) {
   fields.add(fieldFromFile);

   if (carSpecificationCompleted) {
       type = getType(fields);
       if (type == 'American') {
          car = new AmericanCar(fields);
       }
       else if (type == 'European') {
          car = new EuropeanCar(fields);
       }
       cars.add(car);
       clearStoredFields();
   }
}

Haben Sie die Kontrolle über die Datei haben, die in vergangen? Wenn ja, könnte ich schlage vor, die Formatierung es unter Verwendung von XML und dann Parsen mit JDOM ? Es wäre Ihr Leben einfacher in Bezug auf die Analyse machen. Zum Beispiel könnten Sie alle Fahrzeuge Einträge wie folgt formatiert werden:



    <node type="vehicle>
       <attributes location="detroit" color="red" />
    </node>

oder was auch immer Format, das Sie kommen mit. Der Vorteil davon ist, dass Sie können dann nur die Fahrzeuge eingelesen (oder was auch immer Sie wollen), oder verwenden Sie XPath oder eine andere Technologie, um effizient die Informationen erhalten Sie wollen / müssen und laden Sie es auf den richtigen Datentyp.

Mißachtung dieser Rat, wenn Sie keine Kontrolle über Dateiformatierung haben.

Wenn Sie die Wahl haben, Dateiformat ändern.

Sie können Ihr Objekt serialisiert, indem Sie xstream . Dann sind Sie nur das komplette Java-Objekt gespeichert haben, ohne zu überprüfen, ob irgendein Wert existiert.

würde ich verwenden, um die Builder Muster hier statt Factory. Kein großer Unterschied, aber finde es ein bisschen einfacher, wenn die Parameter, wie es variieren scheint in seinem Beispiel zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top