import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
public class Main {
public static void main(String[] args) throws IOException{
HashTable ht = new HashTable(3);
ht.put("sung", "She is pretty");
ht.put("jin", "She is model");
ht.put("hee", "She is angel");
ht.put("min", "She is cute");
System.out.println(ht.get("sung"));
System.out.println(ht.get("jin"));
System.out.println(ht.get("hee"));
System.out.println(ht.get("min"));
System.out.println(ht.get("jae"));
}
static class HashTable{
LinkedList<Node>[] data;
public HashTable(int size) {
this.data = new LinkedList[size];
}
int getHashCode(String key) { //Hash function
int hashCode = 0;
for(char c : key.toCharArray()) {
hashCode += c;
}
return hashCode;
}
int convertToIndex(int hashCode) { //Hash Function
return hashCode % data.length;
}
Node searchKey(LinkedList<Node> list, String key) { //key로 노드를 찾음
if(list == null)
return null;
for(Node node : list) {
if(node.key.equals(key)) {
return node;
}
}
return null;
}
void put(String key, String value) { //해시테이블에 값 삽입
int hashCode = getHashCode(key);
int index = convertToIndex(hashCode);
LinkedList<Node> list = data[index]; //해시테이블에 index에 위치한 리스트를 받아옴
if(list == null) { //만약 리스트가 비어있으면 해시테이블 index 위치에 들어가있는 리스트가 없다는 뜻 이므로 새로운 리스트를 해시테이블에 넣어줌(리스트가 없다 = 인덱스가 비어있다)
list = new LinkedList<Node>();
data[index] = list;
}
Node node = searchKey(list, key); //해시테이블의 index 위치에 위치한 리스트에서 key 값이 같은 노드를 찾음
if(node == null) { //만약에 노드가 비어있으면 이 key는 처음 들어가는 키 이므로 리스트의 마지막에 노드 값 넣어줌
list.addLast(new Node(key,value));
}else {
node.setValue(value); //만약에 key를 가진 노드가 잇으면 노드의 value 값을 바꿔줌
}
}
public String get(String key) {
int hashCode = getHashCode(key);
int index = convertToIndex(hashCode);
LinkedList<Node> list = data[index];
Node node = searchKey(list,key);
return node ==null ? "Not Found" : node.getValue();
}
class Node{
String key;
String value;
public Node(String key, String value) {
this.key = key;
this.value = value;
}
public String getValue() {
return this.value;
}
public void setValue(String value) {
this.value = value;
}
}
}
}