요즘 나는 전에 했던 연상퀴즈게임 프로젝트를 종종 손보고 있다.
오늘은 최근에 했던 정답비교(텍스트의 내용 비교)하는 부분을 포스팅해봐야겠다.
텍스트는 String 이기 때문에 내용 비교를 위해서는 아래와 같이 equals() 메소드를 써야 한다.
(== 연산자는 주소값 비교)
1
2
3
4
5
6
7
8
|
String str1 = "몽몽";
String str2 = "몽몽";
if( str1.equals(str2) ) { //str1과 str2의 내용이 같다면
System.out.println("내용이 같다");
} else { //내용이 같지 않다면
System.out.println("내용이 같지 않다");
}
|
cs |
텍스트 내용 비교 예시 :equals()
str1과 str2 내용이 같기 때문에 "내용이 같다"는 결과값이 출력된다.
1. 파일에 있는 내용 읽어오기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
ArrayList<String> exList2 = new ArrayList<String>();
void answerCheck(String answerWord){
BufferedReader br2;
String line3 = "";
try{
FileReader fr = new FileReader("imgs/스폰지밥.txt");
br2 = new BufferedReader(fr);
while((line3 = br2.readLine()) != null){
exList2.add(line3);
}
}catch(IOException ie){}
String realAnswer = exList2.get(6); //정답이 있는 줄
|
cs |
정답을 체크하는 부분이기 때문에 메소드 이름은 answerCheck이다.
나는 파일의 내용을 따로 담고자 exList2라는 ArrayList을 만들었다.
FileReader로 img 폴더에 있는 스폰지밥.txt 파일을 가져와서
BufferedReader를 이용해 파일에 있는 내용을 한 줄씩 String 타입의 변수 line3에 담았다.
(참고로 스폰지밥.txt에는 문제+답이 한 줄씩 적혀있다.
문제 : 연상단어 6개 / 답 : 연상단어 6개에 대한 답 1개
-> 1~6줄은 문제, 7번째줄 : 답 의 구조)
담을때마다 exList2 에 넣어주고, try~catch 구문으로 IOException 예외 처리해주었다.
그리고 유저가 입력한 답과 비교하기 위해 exList2의 6번째에 담긴 것만 정답으로 따로 뽑았다.
2. 유저가 입력한 답과 비교하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//입력한 답
String answer = answerWord.substring(answerWord.lastIndexOf(":") + 1);
String str = answer.trim(); //띄어쓰기 제거
//정답자 이름 (":" 제거)
String who_answer = answerWord.substring(0, answerWord.indexOf(":") + 1);
String answer_name = who_answer.trim().replaceAll(":","").trim();
int score = 0;
if( str.equals(realAnswer.trim()) ) { //정답 맞췄을때
System.out.println("정답입니다 :D");
System.out.println("who_answer: "+who_answer);
System.out.println("answer_name: "+answer_name);
score++;
}
|
cs |
해당 메소드로 넘어오는 내용이 userId : 메시지 구조이기 때문에 substring과 lastIndexOf로 메시지 내용만 빼냈다.
그리고 누가 맞췄는지 Id도 알아야 하니, 정답자 이름만 다시 뽑아냄
그리고 equals() 메소드로 위에서 정답으로 지정했던 realAnswer과
유저가 입력한 답 str을 비교해 내용이 같다면 score를 1점 증가시키게 만들었다.
여기 코드에는 realAnswer에 trim()을 써서 문제가 없었지만
이 전에는 trim()을 안쓰고 했더니 내용이 분명히 같은데도 결과가 false로 나와서 한참을 애먹었다ㅠㅠ
원인을 찾아보니 스폰지밥.txt 파일 내용에 공백이 있던 것..........
너무나 어처구니없는 실수ㅠㅠㅠㅠㅠ
trim()쓰니까 바로 제대로 적용됐다.
equals() 메소드가 왜 안되는지 구글링으로 한참 헤맸었는데..........
파일에 있는 내용을 읽어서 구현할때는 trim()메소드를 꼭 잊지 말아야겠다!!!
'Java' 카테고리의 다른 글
Java 타이머 : 멀티스레드를 이용한 10초 타이머 (0) | 2020.12.06 |
---|---|
Java 구구단 : 이중 for문을 이용한 구구단 (0) | 2020.11.23 |
Java 별찍기 : 이중 for문을 활용한 별(*) 찍기 (0) | 2020.11.19 |
Java 퀴즈 : 주어진 시간동안 문제 맞추는 O,X 퀴즈(멀티 쓰레드 활용) (0) | 2020.11.11 |
Java 멀티로또 : 명단파일, 숫자 입력받아서 숫자만큼 랜덤 뽑기 (0) | 2020.11.09 |