파일을 읽고 인스턴스 생성하기

킹발·2022년 10월 6일
0
post-thumbnail

예제

오늘 배운 컬렉션 프레임워크에서 해쉬맵과 파일을 읽어오는 방법을 모두 적용할 수 있는 예제이다.

8842height.phe.txt 파일을 읽어서 Patient오브젝트로 만들기

Patient오브젝트 정의

Patient.java

public class Patient {
    private final int id;
    private final String hid;
    private final double height;

    public Patient(int id, String hid, double height) {
        this.id = id;
        this.hid = hid;
        this.height = height;
    }

    public int getId() {
        return id;
    }

    public String getHid() {
        return hid;
    }

    public double getHeight() {
        return height;
    }
}

ReadPatientFile.java

  • 생성자로 파일이름을 받는다.
  • readFile() 메서드가 실행되면
    1. 파일을 한 줄씩 읽어들인다.
    2. 읽어드린 한 줄을 구분자 "\t"을 기준으로 토큰화 하고
    3. 각각 토큰들을 Patient 오브젝트의 필드 타입에 알맞게 형변환 한다.
    4. Paitent 인스턴스를 생성하고 HashMap에 key:id, value:Patient로 저장한다.
    5. 파일의 모든 줄이 끝나면 Patient 인스턴스들을 저장한 HashMap을 반환한다.
import java.io.*;
import java.util.HashMap;
import java.util.StringTokenizer;

public class ReadPatientFile {
    private final String fileName;

    public ReadPatientFile(String fileName) {
        this.fileName = fileName;
    }

    public HashMap<Integer, Patient> readFile() {
        File file = new File(this.fileName);
        String line = "";
        HashMap<Integer, Patient> store = new HashMap<>();

        try {
            FileReader fileReader = new FileReader(file);
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            
            while ((line = bufferedReader.readLine()) != null) {
                StringTokenizer st = new StringTokenizer(line, "\t");
                
                try {
                    int id = Integer.parseInt(st.nextToken());
                    String hid = st.nextToken();
                    double height = Double.parseDouble(st.nextToken());
                    Patient patient = new Patient(id, hid, height);
                    store.put(patient.getId(), patient);
                    
                } catch (NumberFormatException e) {
                    System.out.println("error message: " + e.getMessage());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return store;
    }
}

ReadPatientFileMain

위에서 만들었던 ReadPatientFile 인스턴스를 생성하고 메서드를 실행시켜 Patient 인스턴스들이 담긴 해쉬맵을 얻는다.
얻은 해쉬맵의 길이는 8842이고, 값들도 잘 들어가있다.

import java.util.HashMap;
import java.util.Set;

public class ReadPatientFileMain {
    public static void main(String[] args) {
        ReadPatientFile reader = new ReadPatientFile("8842height.phe.txt");
        HashMap<Integer, Patient> store = reader.readFile();
        
        System.out.println("store.size() = " + store.size());
        
        Set<Integer> keys = store.keySet();
        for (Integer key : keys) {
            Patient patient = store.get(key);
            System.out.printf("id = %d  hid=%s  height=%.1f \n",patient.getId(), patient.getHid(), patient.getHeight());
        }
    }
}
error message: For input string: "id"
store.size() = 8842
id = 1  hid=KNIHGR001511  height=150.0 
id = 2  hid=KNIHGR007239  height=152.5 
id = 3  hid=KNIHGR006959  height=157.0 
id = 4  hid=KNIHGR001805  height=158.0 
id = 5  hid=KNIHGR007805  height=149.0 
id = 6  hid=KNIHGR003426  height=154.0 
id = 7  hid=KNIHGR008635  height=154.0 
---생략---

0개의 댓글