2014-05-07 5 views
0

J'ai une classe appelée Vehicle. Il a quatre sous-classes: Voiture, Moto, Van et Pickup. Voici les déclarations de chacun:Insertion d'un fichier dans un tableau d'objets

 //vehicle 
    String licenseNo = null;   
    int engineCap = 0; 
    int cc = 0; 
    String brand = null; 
    String model = null; 
    int passengers = 0; 
    double price = 0; 

    //car 
    String material = null; 
    String paintType = null; 
    String colorC = null; 

    //motorcycle 
    String mainColor = null; 
    String seatColor = null; 
    String seatMaterial = null; 

    //van 
    int luggageCap = 0; 
    String colorV = null; 

    //pickup 
    int tonsCap = 0; 
    int yearsUsed = 0; 
    String tyreQuality = null; 

Note: Ce n'est pas la façon dont je les a déclarés dans les classes réelles. C'est ainsi que je les ai initialisés dans la méthode im essayant d'écrire.

Voici le reste de la méthode:

FileReader fileReader = new FileReader(filename); 
    BufferedReader in = new BufferedReader(fileReader); 

    int count = 0; 
    Scanner scan = new Scanner(in); 
    while (scan.hasNext()) 
    { 
     vehicledata[count++] = new Vehicle(scan.next(), scan.nextInt(), scan.nextInt(), scan.next(), scan.next() ,scan.nextInt(), scan.nextDouble()); 
    } 

J'ai un tableau:

static Vehicle vehicledata[] = new Vehicle[50]; 

pour maintenir les valeurs du fichier. Le fichier ressemble à ceci: Text file im reading from

Je pourrais lire les valeurs dans une classe de véhicule normale. Mais j'ai besoin de séparer les sous-classes, afin que je puisse les trier par leurs types. (Comme: Liste des voitures, la liste des véhicules utilitaires)

Je suis au:

vehicledata[count++] = new Vehicle(scan.next(), scan.nextInt(), scan.nextInt(), scan.next(), scan.next() ,scan.nextInt(), scan.nextDouble()); 

partie .. et je ne sais pas comment je peux différencier les voitures et d'autres choses à ce stade. (À partir du fichier après le dernier attribut dans le véhicule, il y aura le type de véhicule, suivi par l'attribut de cette sous-classe)

Des indices sur la façon dont je peux faire cela? Une condition si? Mais comment puis-je mettre en œuvre à l'intérieur du

vehicledata[count++] = new Vehicle(scan.next(), scan.nextInt(), scan.nextInt(), scan.next(), scan.next() ,scan.nextInt(), scan.nextDouble());` 
+0

Je créerais le fichier JSON.Vous pouvez mapper à partir de cet objet vers des objets Java, ou simplement gérer le JSON analysé en tant que Maps et Lists. Beaucoup d'outils disponibles. –

+0

Si vous avez besoin d'utiliser la classe scanner (ce qui me semble assez inconfortable), alors vous devez assigner les résultats aux variables temporaires jusqu'à ce que vous puissiez prendre la décision: int i1 = scan.nextInt(); int i2 = scan.nextInt(); Chaîne t = scan.nextString(); if ("Car" .equals (t)) {v = nouvelle voiture (i1, i2); } else if .... – eckes

Répondre

1

Vous pouvez tout mettre dans un fichier csv, quelque chose comme:

L1412,10,100, Nissan, Sedan

et créer une méthode d'usine statique pour créer l'instance que vous souhaitez:

public static Vehical createVehical(String line){ 
     String[] parts = line.split(","); 
     String type = parts[parts.length -1]; //get the last column 
     switch (type) { 
        case "Van": 
         return new Car(a, b, c,...); 
        case "Sedan": 
         return new Van(a, b, c...); 
        default: 
         return null; 
       } 
    } 

Pour la sous-classe de contrôle furture, utilisez

if(vehical instanceof Sedan){ 

}else if(vehical instanceof Van){ 

}else... 

Ou vous pouvez regarder dans Java Collections génériques, il peut vous aider à résoudre votre problème, espère que cela aide

+0

Toujours en train d'essayer d'envelopper ma tête autour du csv. Je n'ai pas compris les parts.length-1 .. pourriez-vous élaborer un petit peu? – Tsar

+0

@ShifaTsar Im essayant de dire faire le fichier d'entrée dans une certaine structure, comme pour chaque ligne "carColor, carPrice, carEngine, ..., carType", toujours faire le type de voiture comme la dernière colonne de la ligne, cette aide à la figure à quelle sous-classe appartient la voiture. Si une colonne n'est pas applicable, la rendre nulle ou n'importe quelle valeur par défaut que vous voulez – haifzhan

+0

On dirait que je viens d'utiliser cette méthode. Je viens de poster une réponse d'une manière similaire. Mettre le type de véhicule en premier. Merci :) – Tsar

0

Vous avez plusieurs classes de véhicules héritant.
Dans votre fichier, vous devez définir le type de votre objet alors tout attribut comme:

van 
xxxx //licenseNo 
xxxx //engineCap 
xxxx //cc 
xxxx //brand 
xxxx //model 
xxxx //passengers 
xxxx //price 
xxxx //luggageCap 
xxxx //colorV 

Maintenant, vous devez déclarer FileReader, BufferedReader et scanner ...
Ok!
Maintenant vous avez plusieurs façons de lire le fichier et stocker dans le tableau que le plus simple est: vous

Van[] arrVan = new Van[50]; 
Car[] arrCar = new Car[50]; 
//etc 
while (scan.hasNext()) 
    { 
     String str = scan.next(); 
     if(str == "van") 
     { 
      Van van = new Van(); 
      van.setlicenseNo(scan.next()); 
      van.setEngineCap(scan.next()); 
      //etc 
      // add van to arrVan 
     } 
     else if(str == "car") 
     { 
      Car car = new Car(); 
      //etc 
      //add car to arrCar 
     } 
     //etc 
    } 
+0

Donc, vous voulez dire que je devrais déclarer chacun des attributs pour les sous-classes séparément? Quel est le point dans la création de classes enfant alors? :/ – Tsar

+0

Non, lorsque votre classe comme Voiture s'étend de Véhicule, tous les attributs de Véhicule existent en Voiture et vous devez mettre cette valeur dans le fichier. Lors de la lecture du fichier, vous devez mettre cette valeur dans une instance de Car par exemple à nouveau. – Hossein

0

Merci pour votre effort :) géré pour résoudre le problème que je rencontrais, en changeant simplement le format de le fichier

while (scan.hasNext()) 
    { 
     if(scan.next().toLowerCase() == "car") 
     { 
      carsdata[count++] = new Car(scan.next(), scan.nextInt(), scan.nextInt(), scan.next(), scan.next() ,scan.nextInt(), scan.nextDouble(), scan.next(), scan.next(), scan.next()); 
     } 
     else if(scan.next().toLowerCase() == "motorcycle") 
     { 
      motorcyclesdata[count++] = new Motorcycle(scan.next(), scan.nextInt(), scan.nextInt(), scan.next(), scan.next() ,scan.nextInt(), scan.nextDouble(), scan.next(), scan.next(), scan.next()); 
     } 
     else if(scan.next().toLowerCase() == "van") 
     { 
      vansdata[count++] = new Van(scan.next(), scan.nextInt(), scan.nextInt(), scan.next(), scan.next() ,scan.nextInt(), scan.nextDouble(), scan.nextInt(), scan.next()); 
     } 
     else if(scan.next().toLowerCase() == "pickup") 
     { 
      pickupsdata[count++] = new Pickup(scan.next(), scan.nextInt(), scan.nextInt(), scan.next(), scan.next() ,scan.nextInt(), scan.nextDouble(), scan.nextInt(), scan.nextInt(), scan.next()); 
     } 
    } 
+0

== est pour l'égalité de référence, je pense que vous voudrez peut-être utiliser a.equals (b) pour comparer l'égalité des valeurs de deux chaînes :) – haifzhan

+0

Merci :) Je reçois toujours une entréemismatchexception ... im en espérant que le reste de mon code fonctionne – Tsar

Questions connexes