들어가기 전에
해시에 내용을 추가하거나 제거하는 방법에 대해 살펴보도록 하겠습니다.
학습 목표
해시의 add와 remove 메소드를 이해할 수 있습니다.
핵심 단어
- 해시
- add와 remove 메소드
강의 듣기
들어가기 전에
해시에 내용을 추가하거나 제거하는 방법에 대해 살펴보도록 하겠습니다.
학습 목표
해시의 add와 remove 메소드를 이해할 수 있습니다.
핵심 단어
강의 듣기
add
해시에 내용을 추가하는 add 메소드입니다. 크기가 너무 커지거나 작아질 경우, add 메소드에서 크기를 조절해주어야 합니다.
public boolean add(K key, V value){
// resize
if (loadFactor() > maxLoadFactor)
resize(tableSize*2);
// 키와 값을 저장해 놓을 object he 정의
HashElement<K,V> he = new HashElement(key, value);
// he의 index 찾기
int hashval = key.hashCode();
hashval = hashval & 0x7FFFFFFF;
hashval = hashval % tableSize;
// add he
harray[hashval].add(he);
numElements++;
return true;
}
remove
remove 메소드에서는 크기 조정을 걱정할 필요도 없고 객체를 생성할 일도 없습니다.
public boolean remove(K key, V value){
// index 찾기
int hashval = key.hashCode();
hashval = hashval & 0x7FFFFFFF;
hashval = hashval % tableSize;
// 해당하는 index의 키와 값 제거
harray[hashval].remove(he);
numElements++;
return true;
}
생각해보기
1) 크기가 작아질 경우, add 메소드에서는 어떻게 크기를 조절하나요?
comment
remove 메소드에서 harray[hashval].remove(he); 를 강의 중 말하셨는데
LinkedList 클래스의 removeFirst나 removeLast가 아닌 remove 메소드를 사용하려면 HashElement의 K key, V value 값이 아닌 HashElement he를 통채로 넘겨줘야 합니다
그러나 he는 add 메서드에서 생성되는 인스턴스이고 remove 메서드에서는 이를 정의하지 않았습니다
he를 remove 메서드에서 활용하려면 넘겨받은 K key와 V value 값을 이용해 he를 만들어 LinkedList의 remove메서드에 넘겨줄 수 있을것 같습니다
하지만 일반적인 경우 key값을 알 때에 해당 오브젝트를 제거하고싶은게 흔할 것이라고 생각합니다
키 값을 통해 빠른 추가/접근/삭제가 해시를 활용하는 주 목적이니까요
다음 강의에서 나오는 getValue 메서드를 참고하여 key 값을 통해 remove를 실행하는 메서드를 작성할 수 있을것 같습니다
remove 메소드에서
HashElement<K, V> he = new HashElement<>(key, value); 라인의 추가와
numElement++ -> numElemnet-- 로 변경이 필요할 듯 보입니다.
remove 메소드에서 해당 요소 삭제 후 요소의 개수를 감소시켜야 할 것 같습니다.
resize 메소드의 인자에 테이블 크기를 전달해서 조절하는데, 보통은 연결 리스트의 요소를 삭제하더라도 그에 따라 테이블 크기를 줄이는 일은 거의 없다고 합니다.