- Published on
HashTable
- Authors
- Name
- Junilliilli
HashTable 구현
- Key 는 문자열로 가정
- Hash Function = 입력 받은 문자열의 각 문자 ASCII 값을 더하여 해쉬코드 생성
- HashTable = 크기를 고정으로 사용, HashCode % size (중복이 많아 좋진않음)
- hash 가 중복되는 경우 linkedList 를 사용하여 value chain 을 형성
// HashTable 선언
class HashTable {
// 배열에 저장될 데이터 타입을 LinkedList 로 선언;
LinkedList<Node>[] data;
public HashTable(int size) {
this.data = new LinkedList[size];
}
class Node {
String key;
String value;
public Node(String key, String value) {
this.key = key;
this.value = value;
}
}
public void put(String key, String value) {
int hashCode = getHashCode(key); // hashCode 변환
int index = convertToIndex(hashCode); // hashCode 를 배열 index 로 치환
LinkedList<Node> list = data[index];
if (list == null) {
list = new LinkedList<Node>();
data[index] = list;
}
Node node = searchKey(list, key);
if (node == null) {
list.addLast(new Node(key, value));
}else {
// 이미 있는 키 중복 exception
}
}
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 ? null : node.value;
}
private int getHashCode(String key) {
int hashcode = 0;
for (char c : key.toCharArray()) {
hashcode += c;
}
return hashcode;
}
private int convertToIndex(int hashCode) {
return hashCode % data.length;
}
private Node searchKey(LinkedList<Node> list, String key) {
if(list == null) return null;
for (Node node : list) {
if (node.key.equals(key)) {
return node;
}
}
return null;
}