- user.txt 파일을 읽어서 합격자만 pass.txt에 저장하는 프로그램 작성
 - user.txt 파일 형식
   이름,국,영,수
 - pass.txt 파일 형식
   이름,국,영,수
 - 세과목 모두 40점 이상이고 평균이 60점 이상인 경우만 합격자
 - pass.txt에 저장할 때는 총점 내림차순으로 저장(단, 이것은 못하겠으면 안해도 됨)
 - UserDTO 만들고, UserPass 라는 클래스를 만들어서 작성할 것
 - ArrayList 사용하면 쉽다. (Map 사용 안함)
 - 작성할 수 있는데 까지 작성해서 메일로 보내기

 

Main

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;

public class Ex012_PassUser {
	public static void main(String[] args) {
		UserPass vo = new UserPass();
		
		vo.loadfile();
		vo.savefile();
		System.out.println("파일 생성 완료...");
		
	}
}

Class

class UserDTO {
	private String name;
	private Integer kor;
	private Integer eng;
	private Integer mat;

	public String getName() {
		return name;
	}

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

	public Integer getKor() {
		return kor;
	}

	public void setKor(Integer kor) {
		this.kor = kor;
	}

	public Integer getEng() {
		return eng;
	}

	public void setEng(Integer eng) {
		this.eng = eng;
	}

	public Integer getMat() {
		return mat;
	}

	public void setMat(Integer mat) {
		this.mat = mat;
	}

}

class UserPass {
	private ArrayList<UserDTO> list = new ArrayList<>();
	private String pathname1 = "user.txt";
	private String pathname2 = "pass.txt";

	
	public void loadfile() {
		try(BufferedReader br = new BufferedReader(new FileReader(pathname1))) {
			String s;
			while ( (s = br.readLine()) != null ) {
				String [] ss = s.split(",");
				
				if(ss.length < 2) {
					continue;
				}
				UserDTO vo = new UserDTO();
				vo.setName(ss[0]);
				
				int kor, eng, mat, tot;
				long ave;
				kor = Integer.parseInt(ss[1]);
				eng = Integer.parseInt(ss[2]);
				mat = Integer.parseInt(ss[3]);
				
				tot = kor+eng+mat;
				ave = tot / 3 ;
				if ( ave >=60 && (kor>=40 && eng>=40 && mat >=40)) {
					vo.setKor(kor);
					vo.setEng(eng);
					vo.setMat(mat);
					
					list.add(vo);
					
				} else {
					continue;
				}
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void savefile() {
		try(PrintStream ps = new PrintStream(pathname2)) {
			Iterator<UserDTO> it = list.iterator();
			
			while(it.hasNext()) {
				UserDTO vo = it.next();
				ps.println(vo.getName()+"\t"+vo.getKor()+"\t"
							+vo.getEng()+"\t"+vo.getMat());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

총점 내림차순은

 

혼자서 해보다가 못했음.

내가 하려고 했던 방법은,

1) int[] 를 만들어서 총점을 담는다.

2) list.add 할 때 만 총점 배열에 총점을 넣음. 그래야 출력(합격자)할 자료들만 모아지니까

3) list.add 가 끝나면 그 배열을 선택정렬을 통해 정렬할때 리스트도 list.set() 으로 바꿈.

 

너무 길어져서 >>

더보기
int [] total = new int[] {list.size()};
int count = 0;

total[count++] = tot;

UserDTO vo2;
int c;

for (int i = 0; i<list.size() -1 ; i++){
	for(int j = i+1; i<list.size() ; j++){
		if(total[i] < total[j]){
        	c = total[i];
            total[i] = total[j];
            total[j] = c;
            
        	vo2 = list.get(i);
            list.set(i, list.get(j));
            list.set(j, vo2);
        }
    }
}

 

원래 합격자들만 출력한 결과는

이것인데 총점 내림차순은 못했음.

public void loadfile() {
		int [] total = new int[] {list.size()};
		try(BufferedReader br = new BufferedReader(new FileReader(pathname1))) {
			String s;
			while ( (s = br.readLine()) != null ) {
				String [] ss = s.split(",");
				
				if(ss.length < 2) {
					continue;
				}
				UserDTO vo = new UserDTO();
				vo.setName(ss[0]);
				
				int kor, eng, mat, tot;
				long ave;
				kor = Integer.parseInt(ss[1]);
				eng = Integer.parseInt(ss[2]);
				mat = Integer.parseInt(ss[3]);
				
				tot = kor+eng+mat;
				ave = tot / 3 ;
				if ( ave >=60 && (kor>=40 && eng>=40 && mat >=40)) {
					vo.setKor(kor);
					vo.setEng(eng);
					vo.setMat(mat);
					
					list.add(vo);
					
					int count = 0;
					
					total[count++] = tot;
					
					
				} else {
					continue;
				}
				
				UserDTO vo2;
				int c;

				for (int i = 0; i<total.length-1 ; i++){
					for(int j = i+1; i<total.length ; j++){
						if(total[i] < total[j]){
							c = total[i];
							total[i] = total[j];
							total[j] = c;
							
							vo2 = list.get(i);
							list.set(i, list.get(j));
							list.set(j, vo2);
						}
					}
				}
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

이렇게 하니까 안터지긴 하는데 결과가 정렬부분 있든 없든 똑같음...

 

그럼

아예 UserDTO 에 총점입력하는 칸을 넣어서 하는 것이 어떨까? 

public class Ex012_PassUser {
	public static void main(String[] args) {
		UserPass vo = new UserPass();

		vo.loadfile();
		vo.sort();
		vo.savefile();
		System.out.println("파일 생성 완료...");

	}
}

class UserDTO {
	private String name;
	private Integer kor;
	private Integer eng;
	private Integer mat;
	private Integer tot;

	public Integer getTot() {
		return tot;
	}

	public void setTot(Integer tot) {
		this.tot = tot;
	}

	public String getName() {
		return name;
	}

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

	public Integer getKor() {
		return kor;
	}

	public void setKor(Integer kor) {
		this.kor = kor;
	}

	public Integer getEng() {
		return eng;
	}

	public void setEng(Integer eng) {
		this.eng = eng;
	}

	public Integer getMat() {
		return mat;
	}

	public void setMat(Integer mat) {
		this.mat = mat;
	}

}

class UserPass {
	private ArrayList<UserDTO> list = new ArrayList<>();
	private String pathname1 = "user.txt";
	private String pathname2 = "pass.txt";

	public void loadfile() {
		try (BufferedReader br = new BufferedReader(new FileReader(pathname1))) {
			String s;
			while ((s = br.readLine()) != null) {
				String[] ss = s.split(",");

				if (ss.length < 2) {
					continue;
				}
				UserDTO vo = new UserDTO();
				vo.setName(ss[0]);

				int kor, eng, mat, tot;
				long ave;
				kor = Integer.parseInt(ss[1]);
				eng = Integer.parseInt(ss[2]);
				mat = Integer.parseInt(ss[3]);

				tot = kor + eng + mat;
				ave = tot / 3;
				if (ave >= 60 && (kor >= 40 && eng >= 40 && mat >= 40)) {
					vo.setKor(kor);
					vo.setEng(eng);
					vo.setMat(mat);
					vo.setTot(tot);

					list.add(vo);

				} else {
					continue;
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void savefile() {
		try (PrintStream ps = new PrintStream(pathname2)) {
			Iterator<UserDTO> it = list.iterator();

			while (it.hasNext()) {
				UserDTO vo = it.next();
				ps.println(vo.getName() + "\t" + vo.getKor() 
						+ "\t" + vo.getEng() + "\t" + vo.getMat());
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void sort() {
		UserDTO vo2;
		for (int i = 0; i < list.size() - 1; i++) {
			for (int j = i + 1; j < list.size(); j++) {
				if(list.get(i).getTot() < list.get(j).getTot()) {
					vo2 = list.get(i);
					list.set(i, list.get(j));
					list.set(j, vo2);
				}
			}
		}
	}
}

 예!! 이렇게 정렬하는 것을 따로 메소드로 만들어서 거기서 총점을 가지고 바꾸는 것을 해보았다.

예! 총점은 확인용으로 출력해보았다.

 

앗싸 - 이게 맞는지는 내일 수업을 듣고 업데이트 하겠다.

 

총점 내림 차순 추가

Main

public class Ex012_PassUser {
	public static void main(String[] args) {
		UserPass vo = new UserPass();

		vo.loadfile();
		vo.sort();
		vo.savefile();
		System.out.println("파일 생성 완료...");

	}
}

Class

class UserDTO {
	private String name;
	private Integer kor;
	private Integer eng;
	private Integer mat;
	private Integer tot;

	public Integer getTot() {
		return tot;
	}

	public void setTot(Integer tot) {
		this.tot = tot;
	}

	public String getName() {
		return name;
	}

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

	public Integer getKor() {
		return kor;
	}

	public void setKor(Integer kor) {
		this.kor = kor;
	}

	public Integer getEng() {
		return eng;
	}

	public void setEng(Integer eng) {
		this.eng = eng;
	}

	public Integer getMat() {
		return mat;
	}

	public void setMat(Integer mat) {
		this.mat = mat;
	}

}

class UserPass {
	private ArrayList<UserDTO> list = new ArrayList<>();
	private String pathname1 = "user.txt";
	private String pathname2 = "pass.txt";

	public void loadfile() {
		try (BufferedReader br = new BufferedReader(new FileReader(pathname1))) {
			String s;
			while ((s = br.readLine()) != null) {
				String[] ss = s.split(",");

				if (ss.length < 2) {
					continue;
				}
				UserDTO vo = new UserDTO();
				vo.setName(ss[0]);

				int kor, eng, mat, tot;
				double ave;
				kor = Integer.parseInt(ss[1]);
				eng = Integer.parseInt(ss[2]);
				mat = Integer.parseInt(ss[3]);

				tot = kor + eng + mat;
				ave = tot / 3;
				if (ave >= 60 && (kor >= 40 && eng >= 40 && mat >= 40)) {
					vo.setKor(kor);
					vo.setEng(eng);
					vo.setMat(mat);
					vo.setTot(tot);

					list.add(vo);

				} else {
					continue;
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void savefile() {
		try (PrintStream ps = new PrintStream(pathname2)) {
			Iterator<UserDTO> it = list.iterator();

			while (it.hasNext()) {
				UserDTO vo = it.next();
				ps.println(vo.getName() + "\t" + vo.getKor() 
						+ "\t" + vo.getEng() + "\t" + vo.getMat());
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void sort() {
		UserDTO vo2;
		for (int i = 0; i < list.size() - 1; i++) {
			for (int j = i + 1; j < list.size(); j++) {
				if(list.get(i).getTot() < list.get(j).getTot()) {
					vo2 = list.get(i);
					list.set(i, list.get(j));
					list.set(j, vo2);
				}
			}
		}
	}
}

user.txt
pass.txt

 

+ Recent posts