Pergunta

Talvez haja um método que faz isso que eu não sei sobre - Duvido embora - mas eu estou tentando converter um array de strings para uma matriz de objetos. Aqui está o problema: Eu estou lendo um arquivo a partir da linha de comando. O arquivo representa várias classes dos seguintes tipos, cada um com seus próprios campos de dados. Veículo é a classe pai de todos os que seguem: Veículo, Carro, Carro americano, carro estrangeiro, caminhão, bicicleta.

Eu não tenho nenhum problema ao ler o arquivo em uma matriz de cadeia. No entanto eu preciso para criar objetos de todos esses tipos e armazená-los em uma matriz do tipo do veículo []. Por exemplo, uma parte dos olhares de arquivo como este:

  • Veículo
  • Kim Stanley Robinson
  • 2344 court drive
  • (221) 885-7777
  • stackoverflow@overflow.com
  • Carro americano
  • John Bunyon
  • 1010 faixa binário
  • (221) 885-55643
  • bgt.com
  • convertable
  • made in detroit
  • planta união

Onde tipo Classe é a primeira linha seguido por, nome do proprietário, endereço, número de telefone, endereço de e-mail ... Cada tipo tem campos específicos para ele. Assim, um carro estrangeiro não for feito em Detroit. Cada um destes campos aparecem em uma linha separada no arquivo. Então, o que eu tenho feito é ler o arquivo inteiro em uma matriz de cadeia. No entanto, eu preciso encontrar meus tipos na matriz de strings, criar objetos desses tipos, e armazená-los em uma matriz veículo. Meu principal problema é que cada campo de dados é em uma linha separada. Como devo abordar este problema? Este é o código java pelo caminho.

Foi útil?

Solução

Inicialmente ler os dados em uma matriz de String é bom. Então você precisa para percorrer essa matriz, e com base na "primeira linha" de cada loop ( "Veículo", "carro americano" etc) você vai saber quantos elementos posteriores da série pertencem à mesma.

Algo assim (eu vou deixar você preencher as lacunas você mesmo):

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

Outras dicas

questão não é clara. Você quer saber como analisar o arquivo e usar as palavras em cada linha para criar um objeto dele?

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

Dicas: Use typeidentifiers no exemplo textfile.for: carro: americancar endereço: 12345 bla etcetc

Ou usar um serializador

Você pode ler o arquivo como você está fazendo agora, mas quando você lê uma cadeia que é um tipo de classe criar uma instância do modelo de veículo correto. Parece que você, então, saber que as próximas linhas x do arquivo são propriedades desse tipo particular de modo que você iria ler as propriedades e colocá-las em sua instância do veículo. Você tem então sua instância do veículo para adicionar à matriz do veículo.

Gostaria de usar um padrão de fábrica que cria adaptadores. A fábrica levaria a string (Vehicle, Carro americano) eo adaptador levaria a matriz de cadeia e índice atual. O adaptador seria responsável para saber quantos índices de ler e devolver o objeto concreto (ou uma interface).

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

Agora, se você tem controle sobre como os dados são armazenados, você pode querer olhar para serialização padrão, mesmo JSON, para facilitar o processamento.

Parece-me que você precisa de um padrão de fábrica para construir o seu conjunto de tipos de veículos a partir de as entradas. A fábrica pode olhar depois de determinar em que uma especificação carro começa e outro termina um. Vai, então, determinar o conjunto de campos para um carro, e determinar o tipo de carro. Ele pode, em seguida, chamar o construtor apropriado, passando em todos os campos relacionados.

Isto significa que um construtor de (digamos) um especifica carro americanos todos os campos que ele está interessado. Um construtor automóvel europeu faria o mesmo. Cada construtor pode afirmar sobre o que tem sido dado para que você não criar quaisquer carros incorretamente.

A fábrica vai cuidar de analisar e separar as entradas, e determinar o que está a ser construída. Cada tipo de olhares construtor do carro depois de informações para que carro só , e executa o apropriado afirma.

A fábrica vai manter a lista de carros criados, e retornar essa lista (da América / Europeia / japonês) após a conclusão.

Em pseudo-código:

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

Você tem o controle do arquivo que está sendo passado em? Se assim for, pode Sugiro formatá-lo usando XML e, em seguida, analisá-lo usando JDOM ? Seria tornar sua vida mais fácil em termos de análise. Por exemplo, você pode formatar todas as entradas do veículo como este:



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

Ou qualquer formato que você venha com. A vantagem disso é que você pode ler em apenas os veículos (ou o que quiser), ou usar XPath ou alguma outra tecnologia para de forma eficiente obter a informação que você quer / necessidade e carregá-lo para o tipo de dados apropriado.

Ignore este conselho se você não tem controle sobre formatação de arquivo.

Quando você tem a opção, altere o formato de arquivo.

Você pode serializar seu objeto usando xstream . Então você só tem que armazenar o objeto Java completa sem verificar se algum valor é existente.

Eu usaria o href="http://en.wikipedia.org/wiki/Builder_pattern" rel="nofollow noreferrer"> Builder padrão

scroll top