-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathImplementSymbolTable.java
More file actions
144 lines (131 loc) · 4.03 KB
/
ImplementSymbolTable.java
File metadata and controls
144 lines (131 loc) · 4.03 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
public class ImplementSymbolTable {
public static void main(String[] args) {
System.out.println("Test SimpleSymbolTable...");
SimpleSymbolTable.test();
System.out.println("================================================");
System.out.println("Test OrderedSymbolTable...");
OrderedSymbolTable.test();
System.out.println("================================================");
}
}
class SimpleSymbolTable<Key, Value> {
public static void test() {
SimpleSymbolTable<Integer, String> s1 = new SimpleSymbolTable<Integer, String>();
s1.put(1, "1");
s1.put(2, "2");
s1.delete(1);
s1.put(2, "3");
s1.put(-2, "3");
s1.put(9, "10");
System.out.println(s1);
System.out.println(s1.size());
System.out.println(s1.get(2));
}
protected class Node {
protected Key key;
protected Value value;
protected Node next;
protected Node(Key key, Value value, Node next) {
this.key = key;
this.value = value;
this.next = next;
}
}
protected Node head;
protected int N;
public SimpleSymbolTable() {
this.head = new Node(null, null, null);
this.N = 0;
}
public int size() {
return this.N;
}
public Value get(Key key) {
Node node = this.head;
while (node.next != null) {
node = node.next;
if (node.key.equals(key)) {
return node.value;
}
}
return null;
}
public void put(Key key, Value value) {
// NOTE: 需要判断是否已经存在这个key
Node node = this.head;
while (node.next != null) {
node = node.next;
if (node.key.equals(key)) {
node.value = value;
return;
}
}
// NOTE: 新插入的节点要放在链表的头部
Node newNode = new Node(key, value, null);
Node oldFirst = this.head.next;
newNode.next = oldFirst;
this.head.next = newNode;
this.N++;
return;
}
public void delete(Key key) {
Node node = this.head;
while (node.next != null) {
if (node.next.key.equals(key)) {
node.next = node.next.next;
this.N--;
return;
}
node = node.next;
}
return;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("{");
Node node = this.head;
for (int i = 0; i < this.N; i++) {
node = node.next;
sb.append(String.format("%s: %s", node.key.toString(), node.value.toString()));
if (i != this.N - 1) {
sb.append(", ");
}
}
sb.append("}");
return sb.toString();
}
}
class OrderedSymbolTable<Key extends Comparable<Key>, Value> extends SimpleSymbolTable<Key, Value> {
public static void test() {
OrderedSymbolTable<Integer, String> s1 = new OrderedSymbolTable<Integer, String>();
s1.put(1, "1");
s1.put(2, "2");
s1.delete(1);
s1.put(2, "3");
s1.put(-2, "3");
s1.put(9, "10");
System.out.println(s1);
System.out.println(s1.size());
System.out.println(s1.get(2));
}
@Override
public void put(Key key, Value value) {
Node currentNode = head.next;
Node preNode = head;
// 遍历到currentNode的key大于等于输入的key或者遍历结束
while (currentNode != null && key.compareTo(currentNode.key) > 0) {
preNode = currentNode;
currentNode = currentNode.next;
}
if (currentNode != null && currentNode.key.compareTo(key) == 0) {
currentNode.value = value;
return;
}
Node newNode = new Node(key, value, null);
preNode.next = newNode;
newNode.next = currentNode;
this.N++;
return;
}
}