2013-01-16 2 views
4

치킨 스키마에 해시 테이블이 있습니다. 해시 테이블에는 해당 키 값이 해시 값과 해시 값으로 다시 해시됩니다. "안쪽 해시"의 키에는 문자열 인 해당 값이 있습니다. (에 익숙한 경우, 해시의 관련 부분이스키마의 다차원 해시 테이블에서 키에 액세스하는 방법은 무엇입니까?

the_hash[group_name][section_name][part_name] = some_text 

처럼 보일 수 있습니다 또는 문자열을 읽고 설정, 루비 말 :.

a_string = the_hash[group_name][section_name][part_name] 

, 예를 들어)

에서 내가 문자열을 읽었을 때, group_name, section_namepart_name이 무엇인지 알고 있어야하며 각 문자열의 값과 for-each 및를 기반으로 특정 작업을 수행 할 수 있어야합니다. Scheme의기능은 주어진 순간에 세 개의 키/하위 키 문자열 중 하나만 사용 가능하기 때문에 충분하지 않은 것으로 보입니다. 각각의 문자열이 가질 수있는 패턴을 모르겠습니다. 웹 검색은 효과적인 해결책을 찾지 못했습니다. 동시에, 나는 상대적으로 계획에 익숙하지 않고 내가해야하는만큼 익숙하지 않을 수도 있습니다. 누구든지 해결책의 방향으로 나를 가리킬 수 있습니까?

답변

2

제도는 다차원 해시에 대한 지원 내장하지 않지만, 적절한 추상화로 당신은 당신의 자신의 구현을 구축 할 수 있습니다 :

; create a new multidimensional hash table 
(define (make-multi-hash) 
    (make-hash-table)) 

; set a value given a non-empty sequence of keys 
(define (multi-hash-set! hash-table value . keys) 
    (let loop ((hash hash-table) 
      (keys keys)) 
    (cond ((null? (cdr keys)) 
      (hash-table-set! hash (car keys) value)) 
      (else 
      (if (not (hash-table-exists? hash (car keys))) 
      (hash-table-set! hash (car keys) (make-multi-hash))) 
      (loop (hash-table-ref hash (car keys)) (cdr keys)))))) 

; retrieve a value given a non-empty sequence of keys 
(define (multi-hash-ref hash-table . keys) 
    (foldl (lambda (k h) (hash-table-ref h k)) 
     hash-table 
     keys)) 

이처럼 사용

(define h (make-multi-hash)) 
(multi-hash-set! h 42 'a 'b 'c) 
(multi-hash-ref h 'a 'b 'c) 
=> 42 

를 사용을 위의 절차를 시작점으로 반드시 필요한 기능을 구현할 수 있습니다. 또한 Chicken Scheme은 "normal"해시 테이블을 처리하기 위해 많은 수의 procedures을 제공합니다.이 구현은 일반적인 해시 테이블을 사용하므로 유용합니다.

+0

나는 group_name, section_name 및 part_name의 어떤 값을 미리 알지 못하기 때문에 답변을 감사 하긴하지만 multi-hash-ref를 호출 할 때이 값이 어떻게 도움이되는지 알지 못합니다. –

+1

또한, 다중 해시 -ref의 람다에서 매개 변수 시퀀스가 ​​(h k)가 아니라 (k h)가되어야한다고 생각합니다. –

+0

@xuinkrbin. 그것은 매개 변수로 전달하기 만하면됩니다.'(multi-hash-ref the_hash group_name section_name part_name)'. 그리고 Scheme 인터프리터에서'foldl'에있는'lambda'의 매개 변수는'(현재 요소, 누적 값)'입니다. 그래서 그것은 저에게 효과적입니다. 그것이 치킨 계획에있는 경우가 아니라면, 그들을 반전하십시오. –

관련 문제