제가이 문제로 고민하고 있습니다. txt 파일을 읽고 내용을 ArrayList에 넣고 싶습니다. 형식은 다음과 같습니다. :텍스트 파일에서 읽기 및 레코드가 빈 줄로 구분됩니다. (자바)
name Yoshida Shuhei
birthday 8-04-1961
phone
email [email protected]
medicalHistory None
address 12 X Street, Suburb,
NSW, Australia
address 13 Y Street, Suburb, VIC, Australia
name Kazuo Hirai
medicalHistory None
email [email protected]
phone 0987654321
birthday 26-11-1972
파일이 여러 환자 기록을 포함하고, 각 환자의 기록에서 레코드가 임의의 순서로 발생할 수있는 블록 (예를 들어 첫 번째 환자의 이름이 먼저지만, 두 번째 환자의 주소이 먼저) 모든 레코드는 공백 행으로 구분됩니다. 내 코드 수,
public static ArrayList<Patient> getData(String fileName) {
try {
File file = new File(fileName);
Scanner reader = new Scanner(file);
ArrayList<Patient> recordList = new ArrayList<Patient>();
ArrayList<MedicalHistory> mhList = new ArrayList<MedicalHistory>();
int index = -1;
int mh_index = -1;
String s;
Patient p = null;
MedicalHistory mh = null;
boolean addressActive = false;
boolean mhActive = false;
while (reader.hasNext()) {
s = reader.nextLine();
Scanner line = new Scanner(s);
String cmd;
if (!s.trim().isEmpty()) {
cmd = line.next();
if (cmd.equalsIgnoreCase("name")) {
index++;
p = new Patient();
p.setName(line.nextLine());
recordList.add(index, p);
addressActive = false;
mhActive = false;
} else if (cmd.equalsIgnoreCase("address")) {
if (line.hasNext()) {
p.setAddress(line.nextLine().trim());
recordList.set(index, p);
}
addressActive = true;
mhActive = false;
} else if (cmd.equalsIgnoreCase("birthday")) {
p.setBirthday(line.nextLine());
recordList.set(index, p);
addressActive = false;
mhActive = false;
} else if (cmd.equalsIgnoreCase("email")) {
if (line.hasNext()) {
p.setEmail(line.nextLine());
recordList.set(index, p);
}
addressActive = false;
mhActive = false;
} else if (cmd.equalsIgnoreCase("phone")) {
if (line.hasNextInt()) {
p.setPhone(line.nextInt());
recordList.set(index, p);
}
addressActive = false;
mhActive = false;
} else if (cmd.equalsIgnoreCase("medicalHistory")) {
mh = new MedicalHistory();
//...parse the medicalHistory
addressActive = false;
mhActive = true;
} else if (addressActive) {
String address = p.getAddress() + " " + s.trim();
p.setAddress(address);
recordList.set(index, p);
} else if (mhActive) {
//to deal with multiple medical histories
} else
System.out.println("Error: no command:" + s);
}
}
reader.close();
return recordList;
} catch (Exception e) {
System.out.println("Error:- " + e.getMessage());
return null;
}
}
문제는 다음과 같습니다
, 여기 내 코드는 현재 라인은 빈 줄이 아닌 경우 내 생각은, 환자의 기록을 읽고 환자 객체로 추가하기 시작한다의 이름이 일 때만 처리됩니다. 첫 번째 비어 있지 않은 라인은 다른 명령으로 시작하는 경우 (예를 들어 주소로 시작),
어디 ...이 초기화, 프로그램이 오류가 발생합니다) (더 새로운 환자가 없을 것 정확히 p = new Patient()을 입력해야합니다. 명령 순서에 상관없이 환자 기록을 읽은 다음 Patient 객체에 데이터를 저장하는 프로그램입니까?
누구든지 내 코드를 개선하고이 조건을 충족시킬 수 있습니까? 고마워요!
OMG에서 실행할 때이 문제를 줄 수 있습니다 .. 스레드로부터 안전하지 않습니다, 그것은 작동! 너는 생명의 은인이야! 도와 줘서 고마워. 나는이 문제를 2 일 동안 붙들 았고, 나는이 논리를 해결할 수 없었다 ... – Carter