재훈재훈
문자열 다루기 예제 2 - index maker 본문
소스 출처 - 부경대 권오흠 교수님, <JAVA로 배우는 자료구조> 강의
/*
index maker
1.입력으로 하나의 텍스트 파일을 읽는다 (sample.txt).
2.텍스트 파일에 등장하는 모든 단어들의 목록을 만들고, 각 단어가 텍스트 파일에
3.등장하는 횟수를 센다. 단, 단어 개수는 100,000개 이하라고 가정한다.
4.사용자가 요청하면 단어 목록을 하나의 파일로 저장한다.
5.사용자가 단어를 검색하면 그 단어가 텍스트 파일에 몇 번 등장하는지 출력한다.
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
public class Code22 {
static String [] words = new String[100000]; // 단어의 갯수
static int [] count = new int[100000]; // 각 단어의 등장 횟수
static int n = 0; // 저장된 단어 목록의 길이
//배열은 자동으로 0으로 초기화됨.
public static void main(String[] args){
Scanner kb = new Scanner(System.in);
while(true){
System.out.print("$ ");
String command = kb.next(); // String을 사용자로부터 입력받음
if(command.equals("read")) { // string.equals(anotherstr) -> 문자열 일치한지 체크
String fileName = kb.next();
makeIndex( fileName );
}
else if(command.equals("find")){
String str = kb.next();
int index = findWord(str);
if(index > -1) {
System.out.println("The word " + words[index] + " appears " + count[index] + " times.");
}
else
System.out.println("The word " + str + " does not appear.");
}
else if(command.equals("saveas")){
String fileName = kb.next();
saveAs( fileName );
}
else if(command.equals("exit")){
break;
}
}
kb.close();
}
static void makeIndex(String fileName){
//파일을 열어서 읽어야 함
try {
Scanner inFile = new Scanner( new File(fileName));
while(inFile.hasNext()){
String str = inFile.next();
addWord( str ); // 내가 읽은 이 str이 첫 단어인가 이미 찾은 단어인가 확인
}
inFile.close();
} catch (FileNotFoundException e) {
System.out.println("No file");
return;
}
}
static void addWord(String str){
int index = findWord(str); //단어들의 목록에 이 단어가 이미 포함되어 있는지 여부 확인 - 있으면 배열 인덱스 반환, 못찾으면 -1 return
if(index != -1){ //찾았다(있다) words[index] == str
count[index]++;
}
else{ //못찾았다 - 새로운 단어가 등장한 것임
words[n] = str;
count[n] = 1;
n++;
}
}
static int findWord(String str){
for(int i=0; i<n; i++)
if(words[i].equalsIgnoreCase((str))) // equalsIgnoreCase 대소문자 무시하고 단어의 일치 유무 확인
return i; //index 반환
return -1; // 찾는 단어가 없음
}
static void saveAs(String fileName) { // 파일 출력 함수
PrintWriter outFile;
try {
outFile = new PrintWriter(new FileWriter(fileName)); // 그냥 외우기
for(int i=0; i<n; i++)
outFile.println(words[i] + " " + count[i]);
outFile.close();
} catch (IOException e) {
System.out.println("Save failed");
return;
}
}
}
'Computer Engineering > JAVA' 카테고리의 다른 글
다형성과 동적 바인딩 (0) | 2018.04.07 |
---|---|
상속과 생성자 (0) | 2018.04.07 |
참조변수(클래스 및 배열)의 선언 및 생성 시 주의할 점 (0) | 2018.04.07 |
문자열 다루기 예제 3 - index maker 수정본 (0) | 2018.04.07 |
문자열 다루기 예제 1 (0) | 2018.04.07 |