Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 두 개의 해시 테이블(HashTable) 조인하기

프로그래밍을 하다 보면 두 개의 컨테이너를 조인(join) 함수로 결합하여 새로운 컨테이너를 만들어야 하는 경우가 종종 있습니다. 이번 글에서는 2개의 HashTable을 인자로 받아 모든 값을 포함하는 새로운 HashTable을 생성하는 정적(static) join 메서드를 직접 구현해 보겠습니다.

구현을 단순하게 유지하기 위해, 두 해시 테이블에 동일한 키가 존재할 경우 두 번째 테이블의 값이 첫 번째 테이블의 값을 덮어쓰도록(override) 설계하겠습니다. 이는 객체 병합 시 일반적으로 사용되는 방식과 같습니다.

join 메서드 구현 예제

static join(table1, table2) {
    // 두 인자가 모두 HashTable인지 검사
    if(!table1 instanceof HashTable || !table2 instanceof HashTable) {
        throw new Error("Illegal Arguments")
    }

    let combo = new HashTable();
    table1.forEach((k, v) => combo.put(k, v));
    table2.forEach((k, v) => combo.put(k, v));
    return combo;
}

위 코드의 동작 방식은 다음과 같습니다.

  • 먼저 전달된 두 인자가 유효한 HashTable 인스턴스인지 확인하고, 그렇지 않으면 에러를 발생시킵니다.
  • 새로운 빈 HashTable(combo)을 생성합니다.
  • forEach를 사용해 첫 번째 테이블의 모든 키-값 쌍을 combo에 삽입합니다.
  • 이어서 두 번째 테이블의 키-값 쌍을 삽입하는데, 이때 중복된 키가 있다면 값이 자연스럽게 갱신(덮어쓰기)됩니다.

동작 테스트

이제 구현한 메서드를 실제로 테스트해 보겠습니다.

let ht1 = new HashTable();

ht1.put(10, 94);
ht1.put(20, 72);
ht1.put(30, 1);

let ht2 = new HashTable();

ht2.put(21, 6);
ht2.put(15, 21);
ht2.put(32, 34);

let htCombo = HashTable.join(ht1, ht2)

htCombo.display();

실행 결과

위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다.

0:
1:
2:
3:
4: { 15: 21 }
5:
6:
7:
8: { 30: 1 }
9: { 20: 72 }
10: { 10: 94 } --> { 21: 6 } --> { 32: 34 }

출력 결과를 보면 두 테이블의 데이터가 충돌 없이 하나의 해시 테이블로 잘 병합된 것을 확인할 수 있습니다. 버킷 10번처럼 서로 다른 키가 동일한 해시 값으로 매핑되는 경우에는 체이닝(chaining) 방식으로 여러 항목이 연결되어 저장됩니다.

이처럼 정적 조인 메서드를 활용하면 원본 데이터를 변경하지 않고도 손쉽게 두 해시 테이블을 결합할 수 있으며, 필요에 따라 덮어쓰기 규칙을 반대로 바꾸거나 병합 로직을 확장하는 것도 가능합니다.