package
PD;
import
java.io.BufferedReader;
import
java.io.FileNotFoundException;
import
java.io.FileReader;
import
java.io.FileWriter;
import
java.io.IOException;
import
java.io.PrintWriter;
/**
* represents the phone directory, i.e. collection of entries.
* provides lookup, add, and remove operations
* 전화번호부 기능을 수행하는 클래스.
* 보기, 추가 , 삭제, 저장기능을 수행한다. */
public
class
PhoneDirectory {
private
static
final
int
INITIAL_CAPACITY =
100
;
private
int
capacity = INITIAL_CAPACITY;
private
int
size =
0
;
private
DirectoryEntry[] theDirectory =
new
DirectoryEntry[capacity];
private
String sourceName =
null
;
private
boolean
modified =
false
;
/** 파일에 기록된 전화번호부를 읽어오는 함수 */
public
void
loadData(String sourceName)
throws
IOException {
this
.sourceName = sourceName;
try
{
BufferedReader in =
new
BufferedReader(
new
FileReader(sourceName));
String name, number;
while
((name = in.readLine()) !=
null
) {
if
((number = in.readLine()) ==
null
) {
break
;
}
add(name, number);
}
in.close();
}
catch
(FileNotFoundException ex) {
return
;
}
}
/** 연락처를 추가하거나 수정하는 함수 */
public
String addOrChangeEntry(String name, String number) {
String oldNumber =
null
;
int
index = find(name);
if
(index > -
1
) {
oldNumber = theDirectory[index].getNumber();
theDirectory[index].setNumber(number);
}
else
{
add(name, number);
}
modified =
true
;
return
oldNumber;
}
/** 저장된 전화번호를 보여주는 함수 */
public
String lookupEntry(String name) {
int
index = find(name);
if
(index > -
1
) {
return
theDirectory[index].getNumber();
}
else
{
return
null
;
}
}
/** 수정(추가, 삭제)된 전화번호부를 저장하는 함수 */
public
void
save() {
if
(modified) {
try
{
PrintWriter out =
new
PrintWriter(
new
FileWriter(sourceName));
for
(
int
i =
0
; i < size; i++) {
if
(theDirectory[i].getNumber() ==
null
)
continue
;
out.println(theDirectory[i].getName());
out.println(theDirectory[i].getNumber());
}
out.close();
modified =
false
;
}
catch
(Exception ex) {
System.err.println(
"Save of directory failed"
);
ex.printStackTrace();
System.exit(
1
);
}
}
}
/** 매개변수 name으로 저장된 연락처를 찾는 함수 */
private
int
find(String name) {
for
(
int
i =
0
; i < size; i++) {
if
(theDirectory[i].getName().equals(name)) {
return
i;
}
}
return
-
1
;
}
/** 이름과 전화번호를 추가하는 함수 */
private
void
add(String name, String number) {
if
(size >= capacity) {
reallocate();
}
theDirectory[size] =
new
DirectoryEntry(name, number);
size++;
}
/** 용량이 가득찼을 경우 용량을 더 할당해주는 함수 */
private
void
reallocate() {
capacity *=
2
;
DirectoryEntry[] newDirectory =
new
DirectoryEntry[capacity];
System.arraycopy(theDirectory,
0
, newDirectory,
0
, theDirectory.length);
theDirectory = newDirectory;
}
/** 연락처를 삭제하는 함수 */
public
void
removeEntry(String name) {
/**** EXERCISE ****/
int
index = find(name);
if
(index > -
1
) {
theDirectory[index].setNumber(
null
);
modified =
true
;
}
}
}