J'ai un fichier csv qui contient les coordonnées du médecin: nom, prénom, adresse, ville, contact préféré, identifiant de contact et spécialité.

J'ai créé une liste de médecins dans laquelle je souhaite stocker mes objets de médecin. J'ai décidé de diviser le scanner.nextLine() et d'analyser chaque valeur en une instance Doctor.

Cela a fonctionné pour moi, toutes les valeurs ont été lues correctement et affectées à la variable correcte associée au médecin, c'est-à-dire le nom, le prénom, etc., mais le seul problème est que si la spécialité d'un médecin est la chirurgie, je suis obligé de stocker une valeur supplémentaire qui est la date de certification.

Pour ce faire, j'ai créé une classe de chirurgien étendue et j'ai essayé d'utiliser l'héritage, mais je me suis perdu à ce stade et je suis à court d'idées sur la façon de résoudre ce problème.

Quelqu'un peut-il me dire ce que je peux changer pour que cela fonctionne?

public class Doctor 
{

    protected String name;
    protected String surname;
    protected String address;
    protected String city;
    protected String preferredContact;
    protected String contactID;
    protected String specialism;

    public Doctor()
    {
        this.name="";
        this.surname="";
        this.address="";
        this.city="";
        this.preferredContact="";
        this.contactID="";
        this.specialism="";
    }

    public Doctor(String name,String surname, String address, String city, String preferredContact, String contactID, String specialism)
    {
        this.name=name;
        this.surname=surname;
        this.address=address;
        this.city=city;
        this.preferredContact=preferredContact;
        this.contactID=contactID;
        this.specialism=specialism;
    }

    public void setName(String name)
    {
        this.name=name;
    }

    public String getName()
    {
        return name;
    }

    public void setSurname(String surname)
    {
        this.surname=surname;
    }

    public String getSurname()
    {
        return surname;
    }

    public void setAddress(String address)
    {
        this.address=address;
    }

    public String getAddress()
    {
        return address;
    }

    public void setCity(String city)
    {
        this.city=city;
    }

    public String getCity()
    {
        return city;
    }

    public void setPreferredContact(String preferredContact)
    {
        this.preferredContact=preferredContact;
    }

    public String getPreferredContact()
    {
        return preferredContact;
    }

    public void setContactID(String contactID)
    {
        this.contactID=contactID;
    }

    public String getContactID()
    {
        return contactID;
    }

    public void setSpecialism(String specialism)
    {
        this.specialism=specialism;
    }

    public String getSpecialism()
    {
        return specialism;
    }

    @Override
    public String toString()
    {
        return "\nName:"+getName()
            +"\nSurname: "+getSurname()
            +"\nAddress: "+getAddress()
            +"\nCity: "+getCity()
            +"\nPreferred Means of Contact: "+getPreferredContact()
            +"\nContact ID: "+getContactID()
            +"\nSpecialism: "+getSpecialism()
            +"\n";

    }

}

public class Surgeon extends Doctor
{

    protected String certificationDate;

    public Surgeon()
    {
        super();
        certificationDate="";
    }

    public Surgeon(String name,String surname, String address, String city, String preferredContact, String contactID, String specialism, String certificationDate)
    {
        super(name,surname,address,city,preferredContact,contactID,specialism);
        this.certificationDate=certificationDate;
    }

    public String getCertificationDate()
    {
        return certificationDate;
    }

    @Override
    public String toString()
    {
        return "\nCertificationDate: "+certificationDate +"\n";
    }
}

public class DoctorImport 
{

    public static void main (String[]args) 
    {   
        int index = 0;

        List<Doctor> doctorsList = new ArrayList<>();

        try
        {
            Scanner scanner=new Scanner(new File("DoctorsFile.csv"));
            Scanner dataScanner;

            while (scanner.hasNextLine())
            {
                dataScanner=new Scanner(scanner.nextLine());
                dataScanner.useDelimiter(",");

                Doctor myDoctor=new Doctor();
                Surgeon mySurgeon=new Surgeon();

                while(dataScanner.hasNext())
                {
                    String data= dataScanner.next();

                    switch (index) 
                    {
                        case 0:
                            myDoctor.setName(data);
                            break;

                        case 1:
                            myDoctor.setSurname(data);
                            break;

                        case 2:
                            myDoctor.setAddress(data);
                            break;

                        case 3:
                            myDoctor.setCity(data);
                            break;

                        case 4:
                            myDoctor.setPreferredContact(data);
                            break;

                        case 5:
                            myDoctor.setContactID(data);
                            break;

                        case 6:
                            myDoctor.setSpecialism(data);
                            break;

                         case 7:
                            mySurgeon.certificationDate=data;
                            break;

                     }
                    index++;
                }
                doctorsList.add(myDoctor);

                if((myDoctor.specialism).equals("Surgery"))
                {
                    doctorsList.add(mySurgeon);
                }

                index=0;  
            }
            System.out.print(doctorsList);
        } 

        catch (FileNotFoundException ex) 
        {
            System.out.print("Error, unable to locate the CSV File!");
        }

    }

}
0
kasia ka 30 nov. 2017 à 00:03

3 réponses

Meilleure réponse

Une approche serait de collecter toutes les données d'abord, puis de créer le bon type d'objet plus tard. Je recommande de lire le Factory Pattern, car il résume la prise de décision sur le type d'objet à construire.

Par exemple:

    ...
    String name = "";
    String surname = "";
    String address = "";
    String city = "";
    String preferredContact = "";
    String contactID = "";
    String specialism = "";
    String certificationDate = "";
    while(dataScanner.hasNext())
    {
        switch (index) 
        {
            case 0:
                name = dataScanner.next();
                break;

            case 1:
                surname = dataScanner.next();
                break;

            case 2:
                address = dataScanner.next();
                break;

            case 3:
                city = dataScanner.next();
                break;

            case 4:
                preferredContact = dataScanner.next();
                break;

            case 5:
                contactID = dataScanner.next();
                break;

            case 6:
                specialism = dataScanner.next();
                break;

            case 7:
                certificationDate = dataScanner.next();
                break;

            default:
                dataScanner.next();
                break;
        }
        index++;
    }

    if (specialism.equals("surgery")) {
        doctorsList.add(new Surgeon(name, surname, address, city, preferredContact, contactID, specialism, certificationDate));
    } else {
        doctorsList.add(new Doctor(name, surname, address, city, preferredContact, contactID, specialism));
    }

Le modèle d'usine pourrait être utilisé pour implémenter la dernière partie où la décision de l'objet à créer est effectuée:

    doctorsList.add(buildDoctor(name, surname, address, city, preferredContact, contactID, specialism, certificationDate));

... qui appelle la méthode d'usine:

private Doctor buildDoctor(String name, String surname, String address, String city, String preferredContact, String contactID, String specialism, String certificationDate) {
    if (specialism.equals("surgery")) {
        return new Surgeon(name, surname, address, city, preferredContact, contactID, specialism, certificationDate);
    } else {
        return new Doctor(name, surname, address, city, preferredContact, contactID, specialism);
    }
}
0
Jason 29 nov. 2017 à 21:33

Le problème est que vous créez à la fois une instance de médecin et une instance de chirurgien. Vous remplissez ensuite l'instance Doctor; si vous avez une date de certification, vous la mettez dans l'instance Chirurgien (sinon vide).

Vous devez créer une instance ou une autre, en fonction de certains critères. Le simple fait de savoir si une date de certification a été dépassée est une mauvaise pratique. Peut-être que le domaine de la spécialisation fonctionnerait.

Si vous avez une instance Chirurgien, affectez-la également au champ Docteur. Ensuite, l'instance unique sera remplie avec toutes les informations.

0
Steve11235 29 nov. 2017 à 21:32

Je suppose que vous avez des erreurs sur votre code.

L'un d'eux est:

Vous avez initialisé un objet Doctor pendant que vous lisez votre fichier, mais s'il a une spécialité, alors vous lisez les données et ajoutez l'objet Surgen à votre liste. MAIS votre objet chirurgien n'a pas d'informations et n'est pas lié à un objet Doctor.

Votre code a-t-il fonctionné à un moment donné? l'avez-vous testé? Si tel est le cas, nous pouvons travailler à partir de ce point.

Cordialement.

0
David Novella 29 nov. 2017 à 21:25
47561754