Domanda

Forse esiste un metodo che fa ciò di cui non sono a conoscenza - ne dubito comunque - ma sto cercando di convertire una matrice di stringhe in una matrice di Oggetti. Ecco il problema: sto leggendo un file dalla riga di comando. Il file rappresenta diverse classi dei seguenti tipi, ognuna con i propri campi dati. Il veicolo è la classe madre di tutti coloro che seguono: Veicolo, Auto, Auto americana, Auto straniera, Camion, Bicicletta.

Non ho problemi a leggere il file in un array di stringhe. Tuttavia, devo creare oggetti di tutti questi tipi e memorizzarli in una matrice di tipo Veicolo []. Ad esempio una parte del file è simile alla seguente:

  • veicolo
  • Kim Stanley Robinson
  • 2344 unità di campo
  • (221) 885-7777
  • stackoverflow@overflow.com
  • American Car
  • John Bunyon
  • 1010 corsia binaria
  • (221) 885-55.643
  • bgt.com
  • convertibile
  • made in detroit
  • impianto sindacale

Dove Tipo di classe è la prima riga seguita da, Nome, indirizzo, numero di telefono, indirizzo e-mail del proprietario ... Ogni tipo ha campi specifici. Quindi un'auto straniera non è prodotta a Detroit. Ognuno di questi campi appare su una riga separata nel file. Quindi quello che ho fatto è leggere l'intero file in un array di stringhe. Tuttavia, devo trovare i miei tipi nell'array di stringhe, creare oggetti di tali tipi e memorizzarli in un array di veicoli. Il mio problema principale è che ogni campo di dati si trova su una riga separata. Come dovrei affrontare questo problema? A proposito, questo è il codice Java.

È stato utile?

Soluzione

La lettura iniziale dei dati in un array String va bene. Quindi è necessario eseguire il ciclo attraverso quell'array e in base alla "prima riga" di ciascun loop ("Veicolo", "Auto americana" ecc.) saprai quanti elementi successivi dell'array appartengono allo stesso.

Qualcosa del genere (ti permetterò di riempire gli spazi vuoti):

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++;
}

Altri suggerimenti

la domanda non è chiara. Vuoi sapere come analizzare il file e usare le parole su ogni riga per crearne un oggetto?

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.
}

Suggerimenti: utilizzare gli identificatori di tipo nel file di testo. ad esempio: auto: americancar indirizzo: 12345 bla etcetc

O usa un serializzatore

Potresti leggere il file come stai facendo proprio ora ma quando leggi una stringa che è un tipo di Classe crea un'istanza del tipo di Veicolo corretto. Sembrerebbe che sapresti quindi che le prossime x righe del file sono proprietà di quel particolare tipo in modo da leggere le proprietà e impostarle sull'istanza del veicolo. È quindi necessario aggiungere l'istanza del veicolo all'array del veicolo.

Vorrei usare un modello Factory che crea gli adattatori. La fabbrica prenderebbe la stringa (Vehicle, American Car) e l'adattatore prenderà l'array di stringhe e l'indice corrente. L'adattatore sarebbe responsabile di sapere quanti indici leggere e restituire l'oggetto concreto (o un'interfaccia).

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

Ora, se hai il controllo su come vengono archiviati i dati, potresti voler esaminare la serializzazione standard, anche JSON, per semplificare l'elaborazione.

Mi sembra che tu abbia bisogno di un modello di fabbrica per costruire il tuo set di tipi di veicoli da gli input. La fabbrica può occuparsi di determinare dove inizia una specifica dell'auto e un'altra finisce. Determinerà quindi la serie di campi per un'auto e determinerà il tipo di auto. Può quindi chiamare il costruttore appropriato, passando in tutti i campi correlati.

Ciò significa che un costruttore di (diciamo) un'auto americana specifica tutti i campi di suo interesse. Un costruttore di automobili europeo farebbe lo stesso. Ogni costruttore può affermare ciò che è stato dato in modo da non creare auto in modo errato.

La fabbrica si occuperà dell'analisi e della separazione degli input e della determinazione di ciò che deve essere costruito. Ogni tipo di costruttore di auto si occupa delle informazioni relative a solo quell'auto ed esegue le asserzioni appropriate.

La fabbrica manterrà l'elenco delle auto create e restituirà tale elenco (di America / Europa / Giappone) al completamento.

In pseudo-codice:

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();
   }
}

Hai il controllo del file che viene passato? In tal caso, potrei suggerire di formattarlo utilizzando XML e quindi analizzarlo utilizzando JDOM ? Ti semplificherebbe la vita in termini di analisi. Ad esempio, è possibile formattare tutte le voci del veicolo in questo modo:



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

O qualunque sia il formato che ti viene in mente. Il vantaggio di questo è che puoi leggere solo nei veicoli (o qualunque cosa tu voglia), oppure usare XPath o qualche altra tecnologia per ottenere in modo efficiente le informazioni che desideri / di cui hai bisogno e caricarle nel tipo di dati corretto.

Ignora questo consiglio se non hai alcun controllo sulla formattazione dei file.

Quando hai la scelta, cambia il formato del file.

Puoi serializzare il tuo oggetto usando xstream . Quindi devi solo memorizzare l'intero oggetto Java senza verificare se esiste un valore.

Userei il modello Builder qui invece che in Factory. Nessuna grande differenza, ma trovalo un po 'più semplice quando i parametri variano come sembra fare nel suo esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top