我有一个CSV文件,其中包含医生的详细信息:名称,姓氏,地址,城市,首选contact,联系ID和专业。
我创建了一个医生清单,我想在其中存储我的医生对象。我决定将scanner.nextLine()
分开,然后将每个值解析为医生实例。
对我有用的,所有值的阅读均正确,并分配给与医生相关的正确变量,即姓名,姓氏等,但唯一的问题是,如果医生的专业是手术,我需要存储一个其他值是认证日期。
为此,我创建了一个扩展的外科医生课程,并尝试使用继承,但在此阶段迷路了,并且对如何解决此问题的想法用完了。
有人能告诉我我可以改变什么来完成这项工作?
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!");
}
}
}
一种方法是首先收集所有数据,然后以后创建正确的对象类型。我建议阅读出厂模式,因为它封装了关于要构建哪种类型对象的决策。
例如:
...
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));
}
工厂模式可用于实现最后一部分,在执行哪个对象的决定中:
doctorsList.add(buildDoctor(name, surname, address, city, preferredContact, contactID, specialism, certificationDate));
...调用工厂方法:
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);
}
}
我想,您的代码上有一些错误。
其中之一是:
您在阅读文件时已经初始化了医生对象,但是如果它具有专业,那么您会读取数据并将Surgen对象添加到列表中。但是您的外科医生对象没有信息,也没有链接到医生对象。
您的代码在某个时候有效吗?你测试过吗?如果是这样,我们可以从那时起工作。
问候。
问题是您正在创建医生和外科医生实例。然后,您填充医生实例;如果您有认证日期,则将其放在(否则为空的)外科医生实例中。
您需要根据某些标准创建一个或另一个实例。仅使用认证日期是否通过,就是做法不佳。也许专业领域会起作用。
如果您有外科医生实例,请将其分配给医生领域。然后,一个实例将填充所有信息。