옹실이의 개발이야기

Java

Java IO/equals() : 파일 내용 읽어온 후 equals()로 텍스트 비교

옹실 2020. 12. 10. 21:43

요즘 나는 전에 했던 연상퀴즈게임 프로젝트를 종종 손보고 있다.
오늘은 최근에 했던 정답비교(텍스트의 내용 비교)하는 부분을 포스팅해봐야겠다.
텍스트는 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()메소드를 꼭 잊지 말아야겠다!!!