고코딩

[JAVA] 자바로 해시테이블 구현 본문

JAVA

[JAVA] 자바로 해시테이블 구현

고코딩 2021. 1. 11. 13:41
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;
            }
        }
    }
}