Question

Peut-être y a-t-il une méthode qui fait cela que je ne connais pas - j'en doute - mais j'essaie de convertir un tableau de chaînes en un tableau d'objets. Voici le problème: je lis un fichier à partir de la ligne de commande. Le fichier représente plusieurs classes des types suivants, chacune avec ses propres champs de données. Vehicle est la classe parente de tous ceux qui suivent: véhicule, voiture, voiture américaine, voiture étrangère, camion, vélo

Je n'ai aucun problème à lire le fichier dans un tableau de chaînes. Cependant, j'ai besoin de créer des objets de tous ces types et de les stocker dans un tableau de type Vehicle []. Par exemple, une partie du fichier ressemble à ceci:

  • Véhicule
  • Kim Stanley Robinson
  • 2344 commande de tribunal
  • (221) 885-7777
  • stackoverflow@overflow.com
  • Voiture américaine
  • John Bunyon
  • 1010 voies binaires
  • (221) 885-55643
  • bgt.com
  • convertible
  • made in detroit
  • centrale syndicale

Où Type de classe est la première ligne suivie de, Nom du propriétaire, adresse, numéro de téléphone, adresse électronique ... Chaque type comporte des champs qui lui sont propres. Donc, une voiture étrangère n'est pas fabriquée à Detroit. Chacun de ces champs apparaît sur une ligne distincte du fichier. Donc, ce que j'ai fait est de lire le fichier entier dans un tableau de chaînes. Cependant, je dois trouver mes types dans le tableau de chaînes, créer des objets de ces types et les stocker dans un tableau Vehicle. Mon problème principal est que chaque champ de données est sur une ligne séparée. Comment dois-je aborder ce problème? C’est du code java au fait.

Était-ce utile?

La solution

La lecture initiale des données dans un tableau String convient parfaitement. Ensuite, vous devez parcourir ce tableau en boucle, en vous basant sur la "première ligne". Pour chaque boucle ("Véhicule", "Voiture américaine", etc.), vous saurez combien d'éléments suivants du tableau appartiennent à la même.

Quelque chose comme ça (je vous laisse remplir vous-même les blancs):

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

Autres conseils

la question n'est pas claire. Voulez-vous savoir comment analyser le fichier et utiliser les mots sur chaque ligne pour en créer un objet?

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

Astuces: utilisez les identificateurs de type dans le fichier texte. Par exemple: voiture: americancar adresse: 12345 bla etcetc

Ou utilisez un sérialiseur

Vous pouvez lire le fichier comme vous le faites maintenant, mais lorsque vous lisez une chaîne qui est un type de classe, créez une instance du type de véhicule approprié. Il semblerait que vous sachiez alors que les x lignes suivantes du fichier sont des propriétés de ce type particulier. Vous devez donc les lire et les définir sur votre instance Vehicle. Vous devez ensuite ajouter votre instance Vehicle au tableau Vehicle.

Je voudrais utiliser un modèle Factory qui crée des adaptateurs. L'usine prendrait la chaîne (Vehicle, American Car) et l'adaptateur, le tableau de chaînes et l'index actuel. L’adaptateur est responsable de la connaissance du nombre d’index à lire et à renvoyer l’objet concret (ou une interface).

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

Maintenant, si vous avez le contrôle sur la manière dont les données sont stockées, vous voudrez peut-être examiner la sérialisation standard, même JSON, pour faciliter le traitement.

Il me semble qu'il vous faut un modèle d'usine pour créer votre ensemble de types de véhicules les entrées. L'usine peut déterminer le lieu où une spécification de voiture commence et une autre se termine. Il va ensuite déterminer l'ensemble des champs pour une voiture et déterminer le type de voiture. Il peut ensuite appeler le constructeur approprié en transmettant tous les champs associés.

Cela signifie qu'un constructeur d'une voiture américaine (par exemple) spécifie tous les domaines qui l'intéressent. Un constructeur automobile européen ferait de même. Chaque constructeur peut affirmer ce qui lui a été donné afin de ne créer aucune voiture de manière incorrecte.

L’usine se chargera de l’analyse et de la séparation des entrées, ainsi que de la définition de ce qui doit être construit. Chaque type de constructeur de voiture traite les informations pour cette voiture uniquement et effectue les assertions appropriées.

L’usine maintiendra la liste des voitures créées et la lui retournera (d’Amérique / Europe / Japonaise) à la fin.

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

Avez-vous le contrôle du fichier en cours de transmission? Si tel est le cas, puis-je suggérer de le formater à l'aide de XML, puis de l'analyser à l'aide de JDOM ? Cela vous faciliterait la vie en termes d'analyse. Par exemple, vous pouvez formater toutes les entrées de véhicule de la manière suivante:



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

Ou quel que soit le format que vous proposez. L'avantage de ceci est que vous pouvez alors lire uniquement dans les véhicules (ou ce que vous voulez), ou utiliser XPath ou une autre technologie pour obtenir efficacement les informations souhaitées / nécessaires et les charger dans le type de données approprié.

Ne tenez pas compte de ce conseil si vous n’avez aucun contrôle sur le formatage du fichier.

Lorsque vous avez le choix, changez le format de votre fichier.

Vous pouvez sérialiser votre objet en utilisant xstream . Il ne vous reste plus qu'à stocker l'intégralité de l'objet Java sans vérifier si une valeur existe.

Je voudrais utiliser le modèle Builder ici à la place de Factory. Pas de grande différence, mais trouvez un peu plus facile quand les paramètres varient, comme il semble le faire dans son exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top