-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLinkedListTester.java
More file actions
170 lines (138 loc) · 4.6 KB
/
Copy pathLinkedListTester.java
File metadata and controls
170 lines (138 loc) · 4.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package list;
import java.util.Comparator;
import java.util.Scanner;
// 연결 리스트 클래스 LinkedList 사용 예
public class LinkedListTester {
static Scanner stdIn = new Scanner(System.in);
// 데이터(회원번호 + 이름)
static class Data {
static final int NO = 1; // 번호를 입력 받습니까?
static final int NAME = 2; // 이름을 입력 받습니까?
private Integer no; // 회원번호
private String name; // 이름
// 문자열을 반환
public String toString() {
return "(" + no + ") " + name;
}
// 데이터를 입력
void scanData(String guide, int sw) {
System.out.println(guide + "할 데이터를 입력하세요.");
if ((sw & NO) == NO) {
System.out.print("번호 : ");
no = stdIn.nextInt();
}
if ((sw & NAME) == NAME) {
System.out.print("이름 : ");
name = stdIn.next();
}
}
// 회원번호로 순서를 매기는 comparator
public static final Comparator<Data> NO_ORDER = new NoOrderComparator();
private static class NoOrderComparator implements Comparator<Data> {
@Override
public int compare(Data o1, Data o2) {
return (o1.no > o2.no) ? 1 : (o1.no < o2.no) ? -1 : 0;
}
}
// 이름으로 순서를 매기는 comparator
public static final Comparator<Data> NAME_ORDER = new NameOrderComparator();
private static class NameOrderComparator implements Comparator<Data> {
@Override
public int compare(Data o1, Data o2) {
return o1.name.compareTo(o2.name);
}
}
}
// 메뉴 열겨형
enum Menu {
ADD_FIRST("머리에 노드를 삽입"), ADD_LAST("꼬리에 노드를 삽입"), RMV_FIRST("머리 노드를 삭제"), RMV_LAST("꼬리 노드를 삭제"),
RMV_CRNT("선택 노드를 삭제"), CLEAR("모든 노드를 삭제"), SEARCH_NO("번호로 검색"), SEARCH_NAME("이름으로 검색"), NEXT("선택 노드로 이동"),
PRINT_CRNT("선택 노드를 출력"), DUMP("모든 노드를 출력"), TERMINATE("종료");
private final String message; // 출력할 문자열
static Menu MenuAt(int idx) { // 서수가 idx인 열거를 반환
for (Menu m : Menu.values())
if (m.ordinal() == idx)
return m;
return null;
}
Menu(String string) { // 생성자
message = string;
}
String getMessage() { // 출력할 문자열을 반환
return message;
}
}
// 메뉴 선택
static Menu selectMenu() {
int key;
do {
for (Menu m : Menu.values()) {
System.out.printf("(%d) %s ", m.ordinal(), m.getMessage());
if ((m.ordinal() % 3) == 2 && m.ordinal() != Menu.TERMINATE.ordinal())
System.out.println();
}
System.out.print(" : ");
key = stdIn.nextInt();
} while (key < Menu.ADD_FIRST.ordinal() || key > Menu.TERMINATE.ordinal());
return Menu.MenuAt(key);
}
@SuppressWarnings("incomplete-switch")
public static void main(String[] args) {
Menu menu; // 메뉴
Data data; // 추가용 데이터 참조
Data ptr; // 검색용 데이터 참조
Data temp = new Data(); // 입력용 데이터
LinkedList<Data> list = new LinkedList<>(); // 리스트를 생서
do {
switch(menu = selectMenu()) {
case ADD_FIRST :
data = new Data();
data.scanData("머리에 삽입", Data.NO | Data.NAME);
list.addFirst(data);
break;
case ADD_LAST :
data = new Data();
data.scanData("꼬리에 삽입", Data.NO | Data.NAME);
list.addLast(data);
break;
case RMV_FIRST :
list.removeFirst(); // 머리 노드를 삭제
break;
case RMV_LAST :
list.removeLast(); // 꼬리 노드를 삭제
break;
case RMV_CRNT :
list.removeCurrentNode(); // 선택 노드를 삭제
break;
case SEARCH_NO : // 회원 번호로 검색
temp.scanData("검색", Data.NO);
ptr = list.search(temp, Data.NO_ORDER);
if(ptr == null)
System.out.println("그 번호의 데이터가 없습니다.");
else
System.out.println("검색 성공 : " + ptr);
break;
case SEARCH_NAME : // 이름으로 검색
temp.scanData("검색", Data.NAME);
ptr = list.search(temp, Data.NAME_ORDER);
if(ptr == null)
System.out.println("그 이름의 데이터가 없습니다.");
else
System.out.println("검색 성공 : " + ptr);
break;
case NEXT : // 선택 노드를 뒤쪽으로 이동
list.next();
break;
case PRINT_CRNT :
list.printCurrentNode(); // 선택 노드의 데이터를 출력
break;
case DUMP :
list.dump(); // 모든 노드를 리스트 순서로 출력
break;
case CLEAR :
list.clear(); // 모든 노드를 삭제
break;
}
} while(menu != Menu.TERMINATE);
}
}