- 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);
}
}
}
![](https://blog.kakaocdn.net/dn/cWa9yK/btrc7O7Pg6m/MDuLAuKHBlhbusKnlkbUq0/img.png)
![](https://blog.kakaocdn.net/dn/bQZlwk/btrc1UBAbRu/JMAkhOz2MXOCi6GVemxHQ1/img.png)
원래 합격자들만 출력한 결과는
![](https://blog.kakaocdn.net/dn/dtgM9U/btrc3q005DI/VB4RUztuhk5HIMCDuGTV11/img.png)
이것인데 총점 내림차순은 못했음.
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);
}
}
}
}
}
예!! 이렇게 정렬하는 것을 따로 메소드로 만들어서 거기서 총점을 가지고 바꾸는 것을 해보았다.
![](https://blog.kakaocdn.net/dn/rhVqL/btrc7OUkgpi/bJbh9vD8bwlI5xZ2rabAj0/img.png)
예! 총점은 확인용으로 출력해보았다.
앗싸 - 이게 맞는지는 내일 수업을 듣고 업데이트 하겠다.
총점 내림 차순 추가
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);
}
}
}
}
}
'쌍용강북교육센터 > 8월' 카테고리의 다른 글
0825_Java : DataInputStream, DataOutputStream 클래스 (0) | 2021.08.25 |
---|---|
0825_Java : BufferedReader, BufferedWriter 클래스 (0) | 2021.08.25 |
0824_Java : Encoding 인코딩 (0) | 2021.08.25 |
0824_Java : CAT 파일의 내용을 읽어 화면에 출력 (0) | 2021.08.25 |
0824_Java : File 클래스 (0) | 2021.08.24 |