PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
// 세줄짜리를 한줄로 줄여줌
설명사항
File
FileProc 기본생성자는 주로 외부에서 파일을 받아오는 편으로 입력값String이 있다
public FileProc_me(String filename) {
file = new File("d:/tmp/"+filename+"txt");
}
loadData 생성자는 문자열을 리턴하므로 String[]형이고 배열을 생성시 먼저 null로 초기화 시켜준 후
//data 의갯수를 조사
//data를 할당
//배열 저장(재 초기화 해줘야 포인터가 맨 앞에 가있으므로 저장시 bufferedReader를 초기화해준다
//return 배열명
saveData는 외부에서 들어온 것이기 때문에 매개변수 배열로 받아주면 된다.
Dao
dao.loadData는 선언부에.
프로그램 종료시 System.exit(0);를 적고 입력받으면 자동종료
파일 저장/로딩코드는 file 클래스에서, 함수 내보내기 불러오기는 DAO 에서.
ex] DAO 기본생성자에 fp로("팀명, 프로젝트명")설정.
public MemberDao_me( ) {
fp = new FileProc_me("baseball");
fp.createFile();
}
saveData 함수는
//등번호/이름.... 순서로 파일에 저장 할 때 중간에 토큰 '-'을 삽입한다
//데이터가 몇개인지부터 파악하고 필요없는 빈칸을 제거하고 human[i].toString()으로 datas[i]에 넣어준다
(toString()은 super.toString() + "-" + win + "-" + lose + "-" + defence; 값)
마지막에
fp.saveData(datas);
loadData 함수는
//파일에서 불러올 때 무조건 문자열로 되어있기 때문에 문자열로 불러와야함(ex, String datas[] = fp.loadData();)
//분류가 Pit과 Bt로 되어있기 때문에 등번호<2000면 Pit으로 분류.
(물론 먼저 Integeer.parseInt(data[0])을 통해 숫자로 변환해줘야 함.)
//객체 생성 후 datas를 human[]에 동적할당하여 값을 저장.
기타
1. Human, Batter, Pitcher은 모두 끌어다 쓸 거여서 getter,setter셋팅, 기본생성자, this. , (toString-> 나중에 출력을 위한것: 오버라이딩 주의)까지 생성해준다
-> 자식클래스의 this. 변수에 Human this.를 추가
-> 자식클래스의 toString()출력부분 앞에 super.toString()을 추가. = Human값까지 출력
(ex, Human [number=4, name=3, age=5, height=3.0] Batter [batcount=4, hit=5, hitAvg=5.0])
2. 나는 데이터 불러오기와 저장까지는 못했음
3. 배열은 부모클래스의 배열로 잡아서 대입
(상속을 받았을 땐 부모클래스의 인스턴스로 자식 클래스를 묶을 수 있음 -> pit[], bt[]가 아닌 human[];)
4. setter, getter 사용을 위해
Batter_me bt = new Batter_me(); 와 같이 자식클래스 객체 생성
5. 주의 할 것으로는
선수의 등번호는 일반적으로 입력받지 않음,
투수인지 / 타자인지 먼저 입력받아 나눠서 정보 수령
6. 삭제 시
allClean()이라는 메서드를 각각 자식클래스에 생성하여 호출하여 사용함
7. 정해진 배열에 입력하기 위해 findIndex를 통해 빈곳을 찾아 대입함
Main
package main;
import java.util.Scanner;
import dao.MemberDao;
public class MainClass {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
MemberDao dao = new MemberDao();
// menu 구성 == front end -> View
while(true) {
System.out.println("1. 선수 등록 ");
System.out.println("2. 선수 삭제 ");
System.out.println("3. 선수 검색 ");
System.out.println("4. 선수 수정 ");
System.out.println("5. 선수 모두 출력 ");
System.out.println("6. 데이터 저장 ");
System.out.println("7. 방어율 Ranking ");
System.out.println("8. 타율 Ranking ");
System.out.println("10. 프로그램 종료 ");
System.out.print("메뉴 번호 입력 >>> ");
int choice = sc.nextInt();
switch( choice ) {
case 1:
dao.insert();
break;
case 2:
dao.delete();
break;
case 3:
dao.select();
break;
case 4:
dao.update();
break;
case 5:
dao.allprint();
break;
case 6:
dao.saveData();
break;
case 7:
break;
case 8:
dao.batterHitRanking();
break;
case 10:
System.out.println("프로그램을 종료합니다");
System.exit(0);
break;
}
}
}
}
D.A.O
// Data Access Object = model == back end
public class MemberDao {
Scanner sc = new Scanner(System.in);
// 배열
//private Pitcher pitcher[];
//private Batter batter[];
private Human human[] = new Human[20]; // 변수 20개 생성
private int memberNumber;
private int memberCount;
FileProc fp;
public MemberDao() {
fp = new FileProc("baseball");
fp.createFile();
// human = new Human[20]; // 변수 20개 생성
/*
human[0] = new Pitcher(1000, "홍길동", 24, 172.1, 10, 3, 0.12);
human[1] = new Batter(2001, "일지매", 21, 182.4, 25, 12, 0.345);
human[2] = new Batter(2002, "정수동", 26, 174.2, 18, 5, 0.253);
*/
// human = new Human(); // 객체 생성
this.loadData();
int lastIndexNum = 0;
for (int i = 0; i < human.length; i++) {
if(human[i] != null) {
lastIndexNum = i;
}
}
if(lastIndexNum > 0) {
memberNumber = 1000 + (human[lastIndexNum].getNumber() % 1000 + 1);
memberCount = lastIndexNum + 1;
}else {
memberNumber = 1000;
memberCount = 0;
}
}
public void insert() {
// 투수/타자 ?
System.out.print("투수(1)/타자(2) = ");
int pos = sc.nextInt();
// human
System.out.print("이름 = ");
String name = sc.next();
System.out.print("나이 = ");
int age = sc.nextInt();
System.out.print("신장 = ");
double height = sc.nextDouble();
Human h = null;
// 투수 1000 ~
if(pos == 1) {
// win
System.out.print("승 = ");
int win = sc.nextInt();
// lose
System.out.print("패 = ");
int lose = sc.nextInt();
// defense
System.out.print("방어율 = ");
double defence = sc.nextDouble();
h = new Pitcher(memberNumber, name, age, height, win, lose, defence);
}
// 타자 2000 ~
else if(pos == 2) {
Batter bat = new Batter();
// 선수 등록 번호
bat.setNumber(memberNumber + 1000);
bat.setName(name);
bat.setAge(age);
bat.setHeight(height);
// 타수
System.out.print("타수 = ");
int batcount = sc.nextInt();
bat.setBatcount(batcount);
// 안타수
System.out.print("안타수 = ");
int hit = sc.nextInt();
bat.setHit(hit);
// 타율
System.out.print("타율 = ");
double hitAvg = sc.nextDouble();
bat.setHitAvg(hitAvg);
h = bat;
}
human[memberCount] = h;
memberNumber++;
memberCount++;
}
public void delete() {
System.out.print("삭제하고 싶은 선수명 입력 = ");
String name = sc.next();
if(name.equals("")) {
System.out.println("이름을 정확히 입력해 주십시오.");
return; // continue
}
int findIndex = search(name);
if(findIndex == -1) {
System.out.println("선수 명단에 없습니다. 삭제할 수 없습니다");
return;
}
// 삭제
if(human[findIndex] instanceof Pitcher) {
Pitcher p = (Pitcher)human[findIndex];
p.setNumber(0);
p.setName("");
p.setAge(0);
p.setHeight(0.0);
p.setWin(0);
p.setLose(0);
p.setDefence(0.0);
}
else if(human[findIndex] instanceof Batter) {
Batter b = (Batter)human[findIndex];
b.allClean();
}
}
public void select() {
System.out.print("검색하고 싶은 선수명 = ");
String name = sc.next();
int findIndex = search(name);
if(findIndex == -1) {
System.out.println("선수 명단에 없습니다.");
}
else {
System.out.println("번호:" + human[findIndex].getNumber());
System.out.println("이름:" + human[findIndex].getName());
System.out.println("나이:" + human[findIndex].getAge());
System.out.println("신장:" + human[findIndex].getHeight());
if(human[findIndex] instanceof Pitcher) {
System.out.println("승리:" + ((Pitcher)human[findIndex]).getWin() );
System.out.println("패전:" + ((Pitcher)human[findIndex]).getLose() );
System.out.println("방어율:" + ((Pitcher)human[findIndex]).getDefence() );
}
else if(human[findIndex] instanceof Batter) {
System.out.println("타수:" + ((Batter)human[findIndex]).getBatcount() );
System.out.println("안타수:" + ((Batter)human[findIndex]).getHit() );
System.out.println("타율:" + ((Batter)human[findIndex]).getHitAvg() );
}
}
}
public void update() {
System.out.print("수정하고 싶은 선수명 = ");
String name = sc.next();
int findIndex = search(name);
if(findIndex == -1) {
System.out.println("선수 명단에 없습니다.");
return;
}
if(human[findIndex] instanceof Pitcher) {
System.out.print("승 = ");
int win = sc.nextInt();
System.out.print("패 = ");
int lose = sc.nextInt();
System.out.print("방어율 = ");
double defence = sc.nextDouble();
Pitcher pit = (Pitcher)human[findIndex];
pit.setWin(win);
pit.setLose(lose);
pit.setDefence(defence);
}
else if(human[findIndex] instanceof Batter) {
System.out.print("타수 = ");
int batcount = sc.nextInt();
System.out.print("안타수 = ");
int hit = sc.nextInt();
System.out.print("타율 = ");
double hitAvg = sc.nextDouble();
Batter bat = (Batter)human[findIndex];
bat.setBatcount(batcount);
bat.setHit(hit);
bat.setHitAvg(hitAvg);
}
}
public void allprint() {
for (int i = 0; i < human.length; i++) {
if(human[i] != null && !human[i].getName().equals("")) {
System.out.println(human[i].toString());
}
}
}
public int search(String name) {
int index = -1;
for (int i = 0; i < human.length; i++) {
if(human[i] != null) {
if(name.equals(human[i].getName())) {
index = i;
break;
}
}
}
return index;
}
public void saveData() {
// 1001-홍길동-24-178.1-10-3-0.12
int len = 0;
for (int i = 0; i < human.length; i++) {
if(human[i] != null) {
len++;
}
}
String datas[] = new String[len];
for (int i = 0; i < datas.length; i++) {
datas[i] = human[i].toString();
}
fp.saveData(datas);
}
public void loadData() {
String datas[] = fp.loadData();
/*
datas : Pitcher, Batter -> Human[]
객체 생성
값을 저장
*/
for (int i = 0; i < datas.length; i++) {
// datas[0 ~ n-1]
// datas[0] => 1000-홍길동-24-178.1-10-2-0.12
// datas[1] => 2001-일지매-21-181.1-21-11-0.34
// datas[2] => 1002-정수동-26-182.4-11-4-0.24
String data[] = datas[i].split("-");
int title = Integer.parseInt(data[0]);
if(title < 2000) { // 투수
human[i] = new Pitcher( Integer.parseInt(data[0]),
data[1],
Integer.parseInt(data[2]),
Double.parseDouble(data[3]),
Integer.parseInt(data[4]),
Integer.parseInt(data[5]),
Double.parseDouble(data[6]) );
}
else {
human[i] = new Batter( Integer.parseInt(data[0]),
data[1],
Integer.parseInt(data[2]),
Double.parseDouble(data[3]),
Integer.parseInt(data[4]),
Integer.parseInt(data[5]),
Double.parseDouble(data[6]) );
}
}
}
// 타율 순위 출력 1 ~ n
public void batterHitRanking() {
// 타자만을 수집한 배열
Human chuman[] = positionSelect(2);
// 확인용
System.out.println("타자만으로 출력용 -----");
for (int i = 0; i < chuman.length; i++) {
System.out.println(chuman[i].toString());
}
// 내림차순 정렬
Human obj = null;
for (int i = 0; i < chuman.length - 1; i++) {
for (int j = i + 1; j < chuman.length; j++) {
Batter b1 = (Batter)chuman[i];
Batter b2 = (Batter)chuman[j];
if(b1.getHitAvg() < b2.getHitAvg()) {
obj = chuman[i];
chuman[i] = chuman[j];
chuman[j] = obj;
}
}
}
// 결과 출력
System.out.println("정렬 후 타자만으로 결과 출력용 -----");
/* for (int i = 0; i < chuman.length; i++) {
System.out.println(chuman[i].toString());
}*/
for (Human h : chuman) { // foreach 문
System.out.println(h.toString());
}
}
// 방어율 순위 출력 1 ~ n
public void pitcherDefenseRanking() {
// 투수만을 수집한 배열
// 올림차순 정렬
// 출력
}
// 타자/투수 만을 산출할 수 있는 함수. 1:투수 2:타자
public Human[] positionSelect(int num) {
int count = 0;
// 우선 몇명인지 카운터
for (int i = 0; i < human.length; i++) {
if(human[i] != null) {
if(num == 1) {
if(human[i].getNumber() < 2000) {
count++;
}
}
else {
if(human[i].getNumber() >= 2000) {
count++;
}
}
}
}
// 명수에 맞게 할당
Human choiceHuman[] = new Human[count];
// 데이터의 수집
int m = 0;
for (int i = 0; i < human.length; i++) {
if(human[i] != null) {
if(num == 1) {
if(human[i].getNumber() < 2000) {
choiceHuman[m] = human[i];
m++;
}
}
else {
if(human[i].getNumber() >= 2000) {
choiceHuman[m] = human[i];
m++;
}
}
}
}
return choiceHuman;
}
}
Human
package dto;
// Data Transfer Object, Value Object
public class Human {
private int number; // sequence number
private String name;
private int age;
private double height;
public Human() {
}
public Human(int number, String name, int age, double height) {
super();
this.number = number;
this.name = name;
this.age = age;
this.height = height;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public String toString() {
return number + "-" + name + "-" + age + "-" + height;
}
}
Pitcher
package dto;
public class Pitcher extends Human {
private int win;
private int lose;
private double defence; // 0.0 ~ 10.0
public Pitcher() {
}
public Pitcher(int number, String name, int age, double height, int win, int lose, double defence) {
super(number, name, age, height);
this.win = win;
this.lose = lose;
this.defence = defence;
//this.setNumber(number);
//this.setName(name);
}
public int getWin() {
return win;
}
public void setWin(int win) {
this.win = win;
}
public int getLose() {
return lose;
}
public void setLose(int lose) {
this.lose = lose;
}
public double getDefence() {
return defence;
}
public void setDefence(double defence) {
this.defence = defence;
}
@Override
public String toString() {
return super.toString() + "-" + win + "-" + lose + "-" + defence;
}
}
Batter
public class Batter extends Human {
private int batcount;
private int hit;
private double hitAvg; // 0.0 ~ 1.0
public Batter() {
// TODO Auto-generated constructor stub
}
public Batter(int number, String name, int age, double height, int batcount, int hit, double hitAvg) {
super(number, name, age, height);
this.batcount = batcount;
this.hit = hit;
this.hitAvg = hitAvg;
}
public int getBatcount() {
return batcount;
}
public void setBatcount(int batcount) {
this.batcount = batcount;
}
public int getHit() {
return hit;
}
public void setHit(int hit) {
this.hit = hit;
}
public double getHitAvg() {
return hitAvg;
}
public void setHitAvg(double hitAvg) {
this.hitAvg = hitAvg;
}
@Override
public String toString() {
return super.toString() + "-" + batcount + "-" + hit + "-" + hitAvg;
}
public void allClean() {
setNumber(0);
setName("");
setAge(0);
setHeight(0.0);
setBatcount(0);
setHit(0);
setHitAvg(0.0);
}
}
File
package file;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class FileProc {
private File file;
public FileProc(String filename) {
file = new File("d:\\tmp\\" + filename + ".txt");
}
public void createFile() {
try {
if(file.createNewFile()) {
System.out.println("파일 생성 성공!");
}else {
System.out.println("파일 생성 실패");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public String[] loadData() {
String datas[] = null;
try {
BufferedReader br = new BufferedReader(new FileReader(file));
// data의 갯수를 조사 -> 배열 list를 사용하면, 이 처리는 필요없음
int count = 0;
String str = "";
while( (str = br.readLine()) != null ) {
count++;
}
br.close();
// datas를 할당
datas = new String[count];
System.out.println("datas.length = " + datas.length);
// 배열 저장
int w = 0;
br = new BufferedReader(new FileReader(file));
while( (str = br.readLine()) != null ) {
datas[w] = str;
w++;
}
br.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return datas;
}
public void saveData(String[] datas) {
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
for (int i = 0; i < datas.length; i++) {
pw.println(datas[i]);
}
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("파일에 저장되었습니다");
}
}
'JAVA > 기초 프로그래밍' 카테고리의 다른 글
ArrayList 와 LinkedList (0) | 2020.06.09 |
---|---|
interface//인터페이스 NameCard (0) | 2020.06.09 |
야구선수 등록 프로그램(Me) (0) | 2020.06.05 |
Calendar 캘린더 Class (0) | 2020.06.03 |
객체//베팅게임 (0) | 2020.06.02 |