2011-10-31 3 views
1

HashMaps에 대한 질문이 있습니다. 우리는 small-c (-ish) 컴파일러를 작성하고 있으며이를 위해 심볼 테이블을 사용하고 있습니다. 해시 맵을 사용하여이를 구현합니다.Java HashMap 중복 버킷 항목

이제 스코프를 고려하기 위해 스택을 사용합니다. 따라서 우리가 새로운 범위에 들어갈 때마다 스택에 이것을 나타내는 토큰을 푸시합니다. 그러면 우리가 만나는 모든 심볼에 대해 해시 맵의 모든 키를 스택에 넣습니다. 여태까지는 그런대로 잘됐다.

범위를 종료하면 토큰에 도달 할 때까지 스택을 팝합니다. 이 전에 우리가 통과 한 모든 기호를 해시 맵에서 제거해야합니다.

코드의 다음 조각을 감안할 때 :

{ 
    a = 5; 
    { 
     a = 5; 
    } 
} 

는 해시 맵이 이것을 받아 들일 것인가? 에서와 같이, 나는 그들을 열쇠로 사용하여 그들을 입력 할 것입니다. 그건 문제가되지 않지만 자바 스크립트가 터지면서이를 제거해야 할 때 Java는 두 객체간에 차이를 만들 수 있습니까? 아니면 두 번째가 첫 번째를 덮어 씁니까?

답변

1

지도의 javadoc

키를 값에 매핑하는 객체입니다. 지도 은 키 중복을 포함 할 수 없습니다. 각 키는 최대 하나의 값으로 매핑 할 수 있습니다.

+0

나는 그것을 읽었다. 그러나 실제로 이것은 답변입니다. – KWyckmans

3

나무를 사용하면 더 나은 해결책이라고 생각합니다. 트리의 각 노드는 변수에 대한 가시성 블록을 정의합니다. 중첩 된 블록의 경우, 리프 노드는 변수의 값을 대체합니다.

+0

흠, 우리는이 가능성에 대해 논의 할 것입니다. – KWyckmans

1

아니요,지도에서 지정된 키에 대해 하나의 값만 가질 수 있기 때문에이 방법은 작동하지 않습니다.

범위간에 위임 메커니즘을 사용합니다. 새 범위를 입력 할 때 새 Scope 객체를 만들고이 범위에 정의 된 모든 새 심볼을 SCope 객체에 포함 된지도 내에 저장합니다. Scope 객체를 둘러싸는 Scope을 가리 키도록합니다 (따라서이 둘러싸는 Scope에 위임하여지도에없는 변수의 값을 찾습니다). 그리고 생성 된 SCope를 현재의 Scope로 만듭니다. 블록을 종료하고 나면 종료 된 스코프의 인 클로징 스코프를 가져 와서 현재 스코프로 만듭니다.

1

나는 두 가지 해결책을 제안하고자합니다.

  1. 지도 사용자 맵. 이것이 JNDI의 작동 방식입니다. 각 네임 스페이스는 변수 자체와지도 자체 인 하위 컨텍스트를 포함 할 수 있으며 해당 수준의 변수를 포함 할 수 있습니다.
  2. 키에 도트 표기법을 사용하십시오. 외부 문맥에 정의 된 첫 번째 변수 인 a는 1.a이고 두 번째 변수는 1.1.a와 같습니다.
+0

그것에 대해 생각할 것입니다! – KWyckmans