Published on

HashTable

Authors
  • avatar
    Name
    Junilliilli
    Twitter

HashTable 구현

  1. Key 는 문자열로 가정
  2. Hash Function = 입력 받은 문자열의 각 문자 ASCII 값을 더하여 해쉬코드 생성
  3. HashTable = 크기를 고정으로 사용, HashCode % size (중복이 많아 좋진않음)
    1. 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;
    }