프로그래밍 언어(관련 배열) 비교
Comparison of programming languages (associative array)비교요인 프로그래밍 언어의 |
---|
|
이 프로그래밍 언어 비교(관련 배열)는 40개 이상의 컴퓨터 프로그래밍 언어에 대한 연관 배열 데이터 구조 또는 배열 조회 처리의 특징을 비교한다.
언어 지원
다음은 다양한 프로그래밍 언어의 연관 배열("매핑", "해시" 및 "사전")을 비교한 것이다.
아악
Awk는 연관 배열을 위한 언어 수준의 지원을 내장하고 있다.
예를 들면 다음과 같다.
전화번호부["샐리 스마트"] = "555-9999" 전화번호부["존 도"] = "555-1212" 전화번호부["J. 랜덤 해커"] = "555-1337"
다음 코드는 연결된 배열을 통해 루프되고 그 내용을 인쇄한다.
을 위해 (이름을 붙이다 에 전화번호부) { 인쇄하다 이름을 붙이다, " ", 전화번호부[이름을 붙이다] }
사용자는 연관 배열에서 요소를 검색하고 배열에서 요소를 삭제할 수 있다.
다음은 연결 및 내장된 문자열 분리 변수 SUBSEP를 사용하여 표준 Awk에서 다차원 연관 배열의 시뮬레이션 방법을 보여준다.
{ # 모든 입력 라인에 대해 다중의[$1 SUBSEP $2]++; } # 끝 { 을 위해 (x 에 다중의) { 갈라지다(x, arr, SUBSEP); 인쇄하다 arr[1], arr[2], 다중의[x]; } }
C
C에는 연관 배열의 표준 구현이 없지만 BSD 라이선스가 있는 제3자 라이브러리인 C 해시 테이블을 사용할 수 있다.[1]
또 다른 제3자 라이브러리인 uthash도 C 구조로부터 연관 배열을 만든다.구조는 값을 나타내며, 구조 분야 중 하나가 키 역할을 한다.[2]
마지막으로, GLib 라이브러리는 많은 다른 고급 데이터 유형과 함께 연관 배열도 지원하며 GNU 프로젝트의 권장 구현이다.[3]
GLIB와 유사하게 애플의 크로스 플랫폼 코어 파운데이션 프레임워크는 몇 가지 기본적인 데이터 유형을 제공한다.특히 참조 카운트 CFDiectionary와 CFMutableDictionary가 있다.
C#
C#는 에 의해 제공된 수집 클래스를 사용한다.NET Framework.가장 일반적으로 사용되는 연관 배열 유형은System.Collections.Generic.Dictionary<TKey, TValue>
, 이것은 변이 가능한 해시 테이블로 구현된다.비교적 새로운 것.System.Collections.Immutable
패키지, 에서 사용 가능NET Framework 버전 4.5 이상 및 의 모든 버전.NET Core, 또한System.Collections.Immutable.Dictionary<TKey, TValue>
AVL 트리를 사용하여 구현되는 유형.일반적으로 객체를 내부로 변이시키는 방법은 변이 후 원래 객체의 상태를 나타내는 새로운 객체를 반환한다.
창조
다음은 변이 가능한 사전을 채우는 세 가지 방법을 보여준다.
- 그
Add
키와 값을 추가하고 키가 사전에 이미 있는 경우 예외를 발생시키는 방법 - 존재하는 경우 기존 값을 덮어쓰는 인덱서에 할당
- 인덱서가 구문 당분인 인덱서의 백업 속성에 할당(C#에는 해당되지 않음, F# 또는 VB 참조).NET 예).
사전<끈을 매다, 끈을 매다> 미끼의 = 새로운 사전<끈을 매다, 끈을 매다>(); 미끼의.추가하다("샐리 스마트", "555-9999"); 미끼의["존 도"] = "555-1212"; // C#에서는 허용되지 않음. // dic.Item("J. Random Hacker") = "553-1337"; 미끼의["J. 랜덤 해커"] = "553-1337";
사전은 또한 "수집 이니셜라이저"를 사용하여 건설 중에 초기화할 수 있으며, 이 사전은 다음과 같은 반복적인 통화로 컴파일된다.Add
.
시합을 하다 미끼의 = 새로운 사전<끈을 매다, 끈을 매다> { { "샐리 스마트", "555-9999" }, { "존 도", "555-1212" }, { "J. 랜덤 해커", "553-1337" } };
키로 액세스
값은 주로 인덱서(키가 존재하지 않을 경우 예외를 발생시키는)와 를 사용하여 검색된다.TryGetValue
메서드 - 검색된 값에 대한 출력 매개 변수와 키가 발견되었는지 여부를 나타내는 부울 반환 값을 가지고 있다.
시합을 하다 샐리넘버 = 미끼의["샐리 스마트"];
시합을 하다 샐리넘버 = (미끼의.TryGetValue("샐리 스마트", 밖으로 시합을 하다 결과) ? 결과 : "n/a";
이 예에서는 다음과 같이 한다.sallyNumber
값이 이제 문자열을 포함함"555-9999"
.
열거
사전은 키 순서, 값의 순서 또는 키 쌍과 값의 쌍으로 볼 수 있다.KeyValuePair<TKey, TValue>
비록 질서에 대한 보장은 없지만.정렬된 사전의 경우, 프로그래머는 다음을 사용할 수 있다.SortedDictionary<TKey, TValue>
또는 를 사용하다.Sort
열거할 때 LINQ 확장 방법.
다음은 포러치 루프를 사용한 열거 방법을 보여준다.
// 컬렉션을 반복하고 각 항목을 표시한다. 앞을 내다(키밸류페어<끈을 매다,끈을 매다> kvp 에 미끼의) { 콘솔.WriteLine("{0}의 전화 번호는 {1}", kvp.키, kvp.가치); }
C++
C++는 연결 배열이라는 형식을 가지고 있다(표준 템플릿 라이브러리#컨테이너 참조).C++에 다음과 같은 코드가 있는 전화번호부 지도를 만들 수 있다.
#include <지도> #include <끈> #include <<utility>> 인트로 본래의() { 찌꺼기::지도를 그리다<찌꺼기::끈을 매다, 찌꺼기::끈을 매다> phone_book; phone_book.삽입하다(찌꺼기::make_make("샐리 스마트", "555-9999")); phone_book.삽입하다(찌꺼기::make_make("존 도", "555-1212")); phone_book.삽입하다(찌꺼기::make_make("J. 랜덤 해커", "553-1337")); }
임시로 생성되므로 효율성이 떨어짐std::string
값:
#include <지도> #include <끈> 인트로 본래의() { 찌꺼기::지도를 그리다<찌꺼기::끈을 매다, 찌꺼기::끈을 매다> phone_book; phone_book["샐리 스마트"] = "555-9999"; phone_book["존 도"] = "555-1212"; phone_book["J. 랜덤 해커"] = "553-1337"; }
C++11의 초기화 리스트의 확장으로 아래와 같이 지도 작성 중에 항목을 추가할 수 있다.
#include <지도> #include <끈> 인트로 본래의() { 찌꺼기::지도를 그리다<찌꺼기::끈을 매다, 찌꺼기::끈을 매다> phone_book { {"샐리 스마트", "555-9999"}, {"존 도", "555-1212"}, {"J. 랜덤 해커", "553-1337"} }; }
다음 코드(C++03)를 사용하여 목록을 반복하십시오.
찌꺼기::지도를 그리다<찌꺼기::끈을 매다, 찌꺼기::끈을 매다>::반복기 꾸르륵거리다, 종지부를 찍다; 을 위해(꾸르륵거리다 = phone_book.시작되다(), 종지부를 찍다 = phone_book.종지부를 찍다(); 꾸르륵거리다 != 종지부를 찍다; ++꾸르륵거리다) 찌꺼기::뻐드렁니가 나다 << 꾸르륵거리다->맨 처음의 << " = " << 꾸르륵거리다->둘째 << 찌꺼기::끝을 맺다;
C++11의 동일한 작업:
을 위해(경시하다 자동차로& 꾸르륵거리다 : phone_book) 찌꺼기::뻐드렁니가 나다 << 꾸르륵거리다.맨 처음의 << " = " << 꾸르륵거리다.둘째 << 찌꺼기::끝을 맺다;
C++17에서 사용할 수 있는 구조화된 바인딩 사용:
을 위해 (경시하다 자동차로& [이름을 붙이다, 번호를 붙이다] : phone_book) { 찌꺼기::뻐드렁니가 나다 << 이름을 붙이다 << " = " << 번호를 붙이다 << 찌꺼기::끝을 맺다; }
C++에서는std::map
class는 키의 데이터 유형과 값이 서로 다를 수 있도록 템플리트로 되어 있다.map
예시의 특정 예에 대해map
클래스는 키가 동일한 기본 유형이어야 한다.모든 값에 대해서도 동일해야 한다.비록 ~일지라도std::map
일반적으로 자체 균형 바이너리 검색 트리를 사용하여 구현되며, C++11은 두 번째 맵이라고 정의된다.std::unordered_map
해시 테이블의 알고리즘 특성을 가지고 있는 .이는 표준 템플릿 라이브러리(STL)에 대한 일반적인 벤더 확장이며, 일반적으로 이 라이브러리(Standard Template Library)로 불린다.hash_map
, SGI 및 STLPort와 같은 구현에서 사용 가능.
CFML
CFML의 구조는 연관 배열과 동일하다.
dynamicKeyName = "존 도"; 전화번호부 = { "샐리 스마트" = "555-9999", "#dynamicKeyName#" = "555-4321", "J. 랜덤 해커" = "555-1337", UnknownComic = "???" }; writeOutput(전화번호부.UnknownComic); // ??? writeDump(전화번호부); // 전체 구조체
코브라
빈 사전 초기화 및 코브라에서 항목 추가:
미끼의 로서 사전<의 끈, 끈> = 사전<의 끈, 끈>() 미끼의.덧셈을('샐리 스마트', '555-9999') 미끼의.덧셈을('존 도', '555-1212') 미끼의.덧셈을('J. 랜덤 해커', '553-1337') 주장하다 미끼의['샐리 스마트'] == '555-9999'
또는 사전은 다음과 같은 구성 중에 모든 항목으로 초기화할 수 있다.
미끼의 = { '샐리 스마트':'555-9999', '존 도':'555-1212', 'J. 랜덤 해커':'553-1337' }
사전은 for-loop에 의해 열거될 수 있지만, 보장된 순서는 없다.
을 위해 핵심을, 발랄하게 하다 에 미끼의 인쇄하다 "[키]의 전화번호는 [발]이다."
D
D는 핵심 언어의 연관 배열들을 직접적으로 지원한다; 그러한 배열들은 이진 트리와 연결된 해시 테이블로 구현된다.[4]동등한 예는 다음과 같다.
인트로 본래의() { 끈을 매다[ 끈을 매다 ] phone_book; phone_book["샐리 스마트"] = "555-9999"; phone_book["존 도"] = "555-1212"; phone_book["J. 랜덤 해커"] = "553-1337"; 돌아오다 0; }
키와 값은 모든 유형이 될 수 있지만 연관 배열의 모든 키는 동일한 유형이어야 하며 종속 값도 동일해야 한다.
모든 속성 및 관련 값을 반복하고 인쇄하는 방법은 다음과 같이 코딩할 수 있다.
앞을 내다 (핵심을, 가치를 매기다; phone_book) { 글씨를 쓰다("의 숫자 " ~ 핵심을 ~ ": " ~ 가치를 매기다 ); }
재산은 다음과 같이 제거할 수 있다.
phone_book.제거하다("샐리 스마트");
델파이
Delphi는 TDictionary를 포함한 몇 가지 표준 컨테이너를 지원한다.T>:
사용하다 시즈유틸츠, 제네릭스.컬렉션; 시합을 하다 전화 번호부: 기술 대표<끈을 매다, 끈을 매다>; 엔트리: TPair<끈을 매다, 끈을 매다>; 시작되다 전화 번호부 := 기술 대표<끈을 매다, 끈을 매다>만들다; 전화 번호부.추가하다('샐리 스마트', '555-9999'); 전화 번호부.추가하다('존 도', '555-1212'); 전화 번호부.추가하다('J. 랜덤 해커', '553-1337'); 을 위해 엔트리 에 전화 번호부 하다 글랜(포맷('%s 번호: %s',[엔트리.키, 엔트리.가치])); 종지부를 찍다.
2009년 이전의 Delphi 버전은 연관 배열의 직접적인 지원을 제공하지 않는다.그러나 연관 배열은 TStrings 클래스를 사용하여 시뮬레이션할 수 있다.
절차 TForm1.버튼1클릭(보낸 사람: 토버젝트); 시합을 하다 데이터필드: TS트링스; i: 정수; 시작되다 데이터필드 := TStringList.만들다; 데이터필드.가치['샐리 스마트'] := '555-9999'; 데이터필드.가치['존 도'] := '555-1212'; 데이터필드.가치['J. 랜덤 해커'] := '553-1337'; // 항목에 액세스하여 메시지 상자에 표시 쇼메시지(데이터필드.가치['샐리 스마트']); // 연관 배열에서 반복 을 위해 i := 0 로 데이터필드.카운트 - 1 하다 시작되다 쇼메시지('의 숫자' + 데이터필드.이름[i] + ': ' + 데이터필드.ValueFromIndex[i]); 종지부를 찍다; 데이터필드.무료; 종지부를 찍다;
얼랑
Erlang은 매핑을 나타내는 많은 방법을 제공한다; 표준 라이브러리에서 가장 흔한 세 가지 방법은 키리스트, 사전, 그리고 지도들이다.
키리스트
키리스트는 튜플 리스트로, 여기서 각 튜플의 첫 번째 요소는 키, 두 번째는 값이다.키리스트에서 작동하기 위한 기능은 에서 제공된다.lists
모듈
전화 번호부 = [{"샐리 스미스", "555-9999"}, {"존 도", "555-1212"}, {"J. 랜덤 해커", "553-1337"}].
키리스트의 요소에 접근하는 것은lists:keyfind/3
함수:
{_, 전화} = 목록:열쇠찾기("샐리 스미스", 1, 전화 번호부), 이오:형식을 갖추다("전화번호:~s~n", [전화]).
사전
사전은 에서 구현된다.dict
표준 라이브러리의 모듈.새 사전은 를 사용하여 작성된다.dict:new/0
function 및 새 키/값 쌍은 를 사용하여 저장된다.dict:store/3
함수:
전화 번호부1 = 받아쓰게 하다:새로운(), 전화 번호부2 = 받아쓰게 하다:저장하다("샐리 스미스", "555-9999", 받아쓰기1), 전화 번호부3 = 받아쓰게 하다:저장하다("존 도", "555-1212", 받아쓰기2), 전화 번호부 = 받아쓰게 하다:저장하다("J. 랜덤 해커", "553-1337", 받아쓰3).
그러한 직렬 초기화에는 Erlang에서 보다 관용적으로 적절한 기능을 나타낼 수 있다.
전화 번호부 = 받아쓰게 하다:from_list([{"샐리 스미스", "555-9999"}, {"존 도", "555-1212"}, {"J. 랜덤 해커", "553-1337"}]).
사전은 다음을 사용하여 액세스할 수 있다.dict:find/2
함수:
{네 알겠습니다, 전화} = 받아쓰게 하다:찾아내다("샐리 스미스", 전화 번호부), 이오:형식을 갖추다("전화:~s~n", [전화]).
두 경우 모두 에를랑 용어를 키로 사용할 수 있다.변형에는 다음이 포함된다.orddict
모듈, 순서 사전 구현 및gb_trees
, 일반 균형 나무들을 구현.
지도
지도는 OTP 17.0에서 도입되었으며,[5] 키리스트와 사전의 장점을 결합하였다.맵은 구문을 사용하여 정의된다.#{ K1 => V1, ... Kn => Vn }
:
전화 번호부 = #{"샐리 스미스" => "555-9999", "존 도" => "555-1212", "J. 랜덤 해커" => "553-1337"}.
지도와 상호 작용하는 기본 기능은 에서 사용할 수 있다.maps
모듈예를 들어,maps:find/2
함수는 키와 관련된 값을 반환한다.
{네 알겠습니다, 전화} = 지도:찾아내다("샐리 스미스", 전화 번호부), 이오:형식을 갖추다("전화:~s~n", [전화]).
사전과 달리 지도는 다음과 같은 패턴으로 매칭될 수 있다.
#{"샐리 스미스", 전화} = 전화 번호부, 이오:형식을 갖추다("전화:~s~n", [전화]).
Erlang은 또한 기능 업데이트를 위한 구문 설탕을 제공한다. 즉, 기존 지도를 기반으로 하지만 수정된 값이나 추가 키를 사용하여 새로운 지도를 만드는 것이다.
전화 번호부2 = 전화 번호부#{ % ':=' 연산자가 기존 키와 관련된 값을 업데이트함 "J. 랜덤 해커" := "355-7331", %=> 연산자가 새 키 값 쌍을 추가하며, 잠재적으로 기존 키 값 쌍을 대체할 수 있음 앨리스 원더랜드 => "555-1865" }
F#
맵['키], 값
런타임에 F#는Collections.Map<'Key,'Value>
유형, 이것은 불변의 AVL 트리 입니다.
창조
다음 예는 다음과 같다.Map
생성자, 이것은 튜플의 목록(대괄호로 둘러싸인 요소의 세미콜론으로 구분된 순서)에서 작동한다(F#는 쉼표로 구분된 요소의 순서).
하게 하다 숫자 = [ "샐리 스마트", "555-9999"; "존 도", "555-1212"; "J. 랜덤 해커", "555-1337" ] > 지도
키로 액세스
값은 다음 중 하나를 통해 조회할 수 있다.Map
회원(예: 인덱서 또는 인덱서)Item
속성(키 없는 경우 예외를 발생) 또는TryFind
함수: 값이 다음과 같은 옵션 유형을 반환함Some <result>
, 성공적인 조회를 위해 또는None
성공하지 못한 사람을 위해서.그런 다음 패턴 일치를 사용하여 결과에서 원시 값을 추출하거나 기본값을 설정할 수 있다.
하게 하다 샐리넘버 = 숫자.["샐리 스마트"] // 또는 하게 하다 샐리넘버 = 숫자.항목("샐리 스마트")
하게 하다 샐리넘버 = 짝을 맞추다 숫자.TryFind("샐리 스마트") 와 함께 일부(번호를 붙이다) -> 번호를 붙이다 없음 -> "n/a"
위의 두 예에서 모두:sallyNumber
값이 문자열을 포함할 수 있음"555-9999"
.
사전<'TKey, 'TValue'
왜냐하면 F#는 a이기 때문이다.NET 언어, 의 기능에도 액세스할 수 있다.NET Framework(NET Framework):System.Collections.Generic.Dictionary<'TKey,'TValue>
유형(해시 테이블로 구현됨)은 C# 및 Visual Basic에서 사용되는 기본 연관 배열 유형이다.이 유형은 의 다른 언어와 함께 작동하도록 의도된 코드를 작성할 때 선호될 수 있다.NET Framework 또는 해시 테이블의 성능 특성이 AVL 트리의 성능 특성보다 선호되는 경우.
창조
그dict
함수는 편리하게 을 생성할 수 있는 수단을 제공한다.변형하지 않는 NET 사전; 일련의 튜플을 수용하고 구현되는 불변의 객체를 반환한다.IDictionary<'TKey,'TValue>
.
하게 하다 숫자 = [ "샐리 스마트", "555-9999"; "존 도", "555-1212"; "J. 랜덤 해커", "555-1337" ] > 받아쓰게 하다
변이 가능한 사전이 필요할 때, 다음 중 하나를 작성한다.System.Collections.Generic.Dictionary<'TKey,'TValue>
직접 호출할 수 있다.자세한 내용은 이 페이지의 C# 예를 참조하십시오.
하게 하다 숫자 = 시스템.컬렉션.포괄적인.사전<끈을 매다, 끈을 매다>() 숫자.추가하다("샐리 스마트", "555-9999") 숫자.["존 도"] <- "555-1212" 숫자.항목("J. 랜덤 해커") <- "555-1337"
키로 액세스
IDictionary
인스턴스는 다음과 같은 방법으로 사용되는 인덱서를 가지고 있다.Map
, 비록 에 해당하지만TryFind
이다TryGetValue
는 검색된 값에 대한 출력 매개 변수와 키가 발견되었는지 여부를 나타내는 부울 반환 값을 가지고 있다.
하게 하다 샐리넘버 = 하게 하다 변이할 수 있는 결과 = "" 만일 숫자.TryGetValue("샐리 스마트", &결과) 그때 결과 다른 "n/a"
또한 F#는 마치 출력 파라미터가 없는 것처럼 함수를 호출하고 대신 출력 파라미터에 할당된 값과 정규 리턴 값을 포함하는 튜플을 반환하도록 허용한다.
하게 하다 샐리넘버 = 짝을 맞추다 숫자.TryGetValue("샐리 스마트") 와 함께 진실의, 번호를 붙이다 -> 번호를 붙이다 _ -> "n/a"
열거
사전 또는 맵은 다음을 사용하여 열거할 수 있다.Seq.map
.
// 컬렉션을 반복하고 각 항목을 표시한다. 숫자 > Seq.지도를 그리다 (재미있다 kvp -> 인쇄하다 "%O의 전화번호는 %O" kvp.키 kvp.가치)
폭스프로
Visual FoxPro는 Collection Class와의 매핑을 구현한다.
매핑 = NEWOBLE("수집") 매핑.추가("수선화", "플라워2") &>(객체, 키) – 키는 문자 색인 = 매핑이어야 한다.GetKey("flower2") &&은 인덱스 값 1 객체 = 매핑("flower2") &&은 "Daffodils"(키에 의한 리트리브) 객체 = 매핑(1) &&&은 "Daffodils"(인덱스에 의한 리트리브)를 반환한다.
키를 찾을 수 없으면 GetKey가 0을 반환한다.
가다
Go는 "맵"이라고 불리는 연관 배열의 언어 수준의 기본 지원을 가지고 있다.맵의 키 유형은 부울, 숫자, 문자열, 배열, 구조체, 포인터, 인터페이스 또는 채널 유형일 수 있다.
지도 유형은 다음과 같이 기록:map[keytype]valuetype
한 번에 하나씩 요소 추가:
phone_book := 만들다(지도를 그리다[끈을 매다] 끈을 매다) // 빈 지도 만들기 phone_book["샐리 스마트"] = "555-9999" phone_book["존 도"] = "555-1212" phone_book["J. 랜덤 해커"] = "553-1337"
지도 리터럴:
phone_book := 지도를 그리다[끈을 매다] 끈을 매다 { "샐리 스마트": "555-9999", "존 도": "555-1212", "J. 랜덤 해커": "553-1337", }
지도를 통해 반복:
// 키와 값을 모두 사용 을 위해 핵심을, 가치를 매기다 := 범위 phone_book { fmt.프린트프("%s 번호: %s\n", 핵심을, 가치를 매기다) } // 키만으로 을 위해 핵심을 := 범위 phone_book { fmt.프린트프("이름: %s\n", 핵심을) }
하스켈
Haskell 프로그래밍 언어는 오직 한 종류의 연관 컨테이너를 제공한다 – 쌍들의 목록:
m = [("샐리 스마트", "555-9999"), ("존 도", "555-1212"), ("J. 랜덤 해커", "553-1337")] 본래의 = 인쇄하다 (찾다 "존 도" m)
출력:
단지 "555-1212"
조회 함수는 "아마도" 값을 반환하는데, 이 값은 "Nothing"이면 "Nothing" 또는 "Just '결과'일 경우"라는 점에 유의하십시오.
Haskell의 가장 일반적으로 사용되는 구현인 GHC는 두 종류의 연관 용기를 더 제공한다.다른 구현도 이러한 기능을 제공할 수 있다.
하나는 다형성 기능 맵(불변성 균형 이진수)이다.
수입하다 자격이 있는 Data.Map 로서 M m = M.삽입하다 "샐리 스마트" "555-9999" M.텅 빈 m' = M.삽입하다 "존 도" "555-1212" m m'' = M.삽입하다 "J. 랜덤 해커" "553-1337" m' 본래의 = 인쇄하다 (M.찾다 "존 도" m'' :: 어쩌면 끈)
출력:
단지 "555-1212"
정수 키에 대한 전문 버전은 데이터로도 존재한다.인트맵.
마지막으로, 다형 해시 테이블:
수입하다 자격이 있는 Data.HashTable 로서 H 본래의 = 하다 m <- H.새로운 (==) H.해시스트링 H.삽입하다 m "샐리 스마트" "555-9999" H.삽입하다 m "존 도" "555-1212" H.삽입하다 m "J. 랜덤 해커" "553-1337" foo <- H.찾다 m "존 도" 인쇄하다 foo
출력:
단지 "555-1212"
쌍과 기능 맵의 목록은 모두 하스켈에서 더 관용적인 순기능 인터페이스를 제공한다.이와는 대조적으로 해시 테이블은 IO 모나드에서 필수 인터페이스를 제공한다.
자바
자바에서 연관 배열은 자바 모음 프레임워크의 일부인 "맵"으로 구현된다.J2SE 5.0과 Java에 제네릭을 도입했기 때문에 컬렉션은 지정된 유형을 가질 수 있다. 예를 들어 문자열을 문자열에 매핑하는 연관 배열을 다음과 같이 지정할 수 있다.
지도<끈, 끈> 전화번호부 = 새로운 해시맵<끈, 끈>(); 전화번호부.놓다("샐리 스마트", "555-9999"); 전화번호부.놓다("존 도", "555-1212"); 전화번호부.놓다("J. 랜덤 해커", "555-1337");
그get
키에 액세스하는 데 메소드가 사용됨(예: 표현식 값)phoneBook.get("Sally Smart")
이다"555-9999"
. 이 코드는 해시 맵을 사용하여 연관 배열의 생성자를 호출하여 저장한다.HashMap
그러나, 코드는 인터페이스에 공통적인 방법만을 사용하기 때문에Map
, 자급자족하는 이진 트리는 의 생성자를 호출하여 사용할 수 있다.TreeMap
클래스(하위 인터페이스 구현)SortedMap
))의 정의를 변경하지 않고phoneBook
변수 또는 코드의 나머지 부분 또는 구현하는 다른 기본 데이터 구조 사용Map
접점
HashMap과 HashSet에서 사용되는 Java의 해시함수는 다음에서 제공한다.Object.hashCode()
방법의Java의 모든 클래스는 다음에서 상속되므로Object
, 모든 물체는 해시함수를 가지고 있다.클래스는 의 기본 구현을 재정의할 수 있다.hashCode()
개체의 속성에 따라 사용자 지정 해시 함수를 더 많이 제공하는 것.
그Object
클래스는 또한 다음을 포함한다.equals(Object)
다른 개체와의 동일성을 테스트하는 방법.Java의 해시드 데이터 구조는 다음 계약을 유지하는 객체에 의존한다.hashCode()
그리고equals()
방법:
a와 b 두 물체에 대해,
a.대등하다(b) == b.대등하다(a) 만일 a.대등하다(b), 그때 a.해시코드() == b.해시코드()
이 계약을 유지하기 위해 재정의하는 클래스는equals()
또한 재정의해야 한다.hashCode()
, 그리고 그 반대는 , 그래서hashCode()
동일한 속성(또는 속성의 하위 집합)을 기반으로 함equals()
.
해시된 데이터 구조가 개체와 맺은 추가 계약은 그 결과라는 것이다.hashCode()
그리고equals()
객체를 지도에 삽입한 후에는 방법이 변경되지 않는다.이러한 이유로, 일반적으로 해시함수는 객체의 불변성 특성을 기반으로 하는 것이 좋은 관행이다.
이와 유사하게 TreeMap 및 기타 정렬된 데이터 구조는 데이터 유형에 대해 순서를 정의해야 한다.데이터 형식은 이미 다음을 구현하여 자체 순서를 정의하고 있어야 한다.Comparable
인터페이스 또는 사용자 정의Comparator
지도가 작성될 때 제공되어야 한다.위의 해시맵과 마찬가지로, TreeMap에서 키의 상대적 순서는 일단 맵에 삽입한 후에는 변경되지 않아야 한다.
자바스크립트
자바스크립트(및 그것의 표준화된 버전, ECMAScript)는 프로토타입 기반의 객체 지향 언어다.
지도 및 약점 지도
최신 JavaScript는 다음을 사용하여 연관 배열 처리Map
그리고WeakMap
반지도에는 기본적으로 어떤 키도 포함되어 있지 않으며, 지도에 명시적으로 입력된 키만 포함되어 있다.키와 값은 모든 유형(함수, 객체 또는 원시 포함)이 될 수 있다.
창조
지도는 시공 중에 모든 항목으로 초기화할 수 있다.
경시하다 전화번호부 = 새로운 지도([ ["샐리 스마트", "555-9999"], ["존 도", "555-1212"], ["J. 랜덤 해커", "553-1337"], ]);
또는 빈 맵을 초기화한 후 다음 항목을 추가하십시오.
경시하다 전화번호부 = 새로운 지도(); 전화번호부.세트("샐리 스마트", "555-9999"); 전화번호부.세트("존 도", "555-1212"); 전화번호부.세트("J. 랜덤 해커", "553-1337");
키로 액세스
지도의 요소에 접근하는 작업은get
방법:
경시하다 샐리넘버 = 전화번호부.얻다("샐리 스마트");
이 예에서는 값이sallyNumber
이제 "555-9999" 문자열을 포함할 것이다.
열거
지도에 있는 열쇠는 주문되어 있다.따라서, 그것을 통해 반복할 때, 지도 객체는 삽입 순서대로 키를 반환한다.다음은 for-루프를 사용한 열거 방법을 보여준다.
// 컬렉션을 반복하고 각 항목을 표시한다. 을 위해 (경시하다 [이름을 붙이다, 번호를 붙이다] 의 전화번호부) { 위로하다.통나무를 하다(에 대한 전화번호${이름을 붙이다}이다${번호를 붙이다}`); }
키는 다음과 같이 제거할 수 있다.
전화번호부.삭제하다("샐리 스마트");
오브젝트
객체는 지도와 유사하다. 둘 다 값에 대한 키를 설정하고, 값을 검색하며, 키를 삭제하며, 값이 키에 저장되어 있는지 여부를 탐지할 수 있다.이러한 이유 때문에(그리고 내장된 대체물이 없었기 때문에), 역사적으로 객체는 지도로 사용되어 왔다.
그러나 어떤 경우에는 지도를 더 선호하게 만드는 중요한 차이점이 있다.JavaScript에서 객체는 속성 이름에서 값으로의 매핑이다. 즉, 하나의 주의사항과 연관 배열: 객체의 키는 문자열 또는 기호여야 한다(본래의 객체와 원시형은 문자열 키로 암묵적으로 변환되는 것이 허용됨).개체에는 연관 배열과 무관한 한 가지 기능도 포함되어 있는데, 즉 개체에는 프로토타입이 있기 때문에 사용자 정의 키와 충돌할 수 있는 기본 키가 포함되어 있다.따라서, 객체가 속성을 정의하지 않는 경우, 속성 조회를 수행하면 시제품의 정의에 대한 조회를 가리킨다.
객체 문자 그대로는 다음과 같이 기록된다.{ property1: value1, property2: value2, ... }
. 예:
경시하다 myObject = { "샐리 스마트": "555-9999", "존 도": "555-1212", "J. 랜덤 해커": "553-1337", };
룩업이 프로토타입의 속성을 사용하지 않도록 하려면Object.setPrototypeOf
함수:
오브젝트.setPrototypeOf(myObject, 무효의);
ECMAScript 5(ES5)의 경우, 프로토타입도 다음을 사용하여 우회할 수 있다.Object.create(null)
:
경시하다 myObject = 오브젝트.만들다(무효의); 오브젝트.할당하다(myObject, { "샐리 스마트": "555-9999", "존 도": "555-1212", "J. 랜덤 해커": "553-1337", });
속성 이름이 유효한 식별자일 경우 다음과 같이 인용문을 생략할 수 있다.
경시하다 myOtherObject = { foo: 42, 술집을 내다: 거짓의 };
룩업은 항상 작동하는 대괄호나 식별자 키에만 적용되는 점 표기법 중 하나인 속성 액세스 표기법을 사용하여 작성된다.
myObject["존 도"] myOtherObject.foo
또한 다음과 같이 열거할 수 있는 모든 속성 및 관련 값을 반복할 수 있다(포인 루프).
을 위해 (경시하다 재산 에 myObject) { 경시하다 가치를 매기다 = myObject[재산]; 위로하다.통나무를 하다(마이 오브젝트[My Object]${재산}] =${가치를 매기다}`); }
또는 (루프용):
을 위해 (경시하다 [재산, 가치를 매기다] 의 오브젝트.출품작(myObject)) { 위로하다.통나무를 하다(`${재산}=${가치를 매기다}`); }
재산은 다음과 같이 제거할 수 있다.
삭제하다 myObject["샐리 스마트"];
앞에서 말한 바와 같이 속성은 문자열과 기호다.모든 네이티브 개체와 원시 개체를 문자열로 암시적으로 변환할 수 있으므로 다음을 수행할 수 있다.
myObject[1] // 키는 "1"이며 myObject[1] == myObject["1"] myObject[["a", "b"]] // 키는 "a,b" 입니다. myObject[{ 토스트링() { 돌아오다 "헬로 월드"; } }] // 키는 "헬로 월드" 입니다.
현대의 JavaScript에서는 어레이 유형을 연관 배열로 사용하는 것이 나쁜 형태로 간주된다.Object type과Map
/WeakMap
수업은 이 목적에 가장 좋다.그 이면의 논리는 프로토타입을 통해 어레이를 확장하고 오브젝트를 청정하게 유지한다면 관련 'array'에서 예상한 대로 루프와 포 인 루프가 작동한다는 것이다.이 문제는 자바스크립트의 내장형(inbuilt type)을 확장하기 위해 무겁고 때로는 무분별하게 프로토타입을 사용하는 자바스크립트 프레임워크의 인기에 의해 표면화되었다.
이 문제에 대한 자세한 내용은 JavaScript Array And Object 프로토타입 인식의 날을 참조하십시오.
줄리아.
Julia에서는 다음 작전이 연관 배열을 관리한다.
사전 선언:
전화번호부 = 받아쓰기( "샐리 스마트" => "555-9999", "존 도" => "555-1212", "J. 랜덤 해커" => "555-1337" )
액세스 요소:
전화번호부["Sally Smart"]
요소 추가:
전화번호부["]새 연락처"] = "555-2222"
요소 삭제:
삭제!(전화 번호부, "Sally Smart")
반복 가능한 키 및 값 가져오기:
키(전화 번호부) 값(전화 번호부)
KornShell 93 및 호환 쉘
KornShell 93 및 호환 쉘(ksh93, bash4...)에서는 다음과 같은 작업을 연관 어레이와 함께 사용할 수 있다.
정의:
유형 집합 -A 전화 번호부; # ksh93 선언 -A 전화번호부; # bash4 전화 번호부=["Sally Smart"]="555-9999"["존 도"]="555-1212"["]="555-1337";;
참조 취소:
${전화번호부["존 도"]};
리스프
Lisp는 원래 "LIST Processing" 언어로 구상되었으며, 가장 중요한 데이터 유형 중 하나가 연계 목록("alist")으로 취급할 수 있는 링크된 목록이다.
'(("샐리 스마트" . "555-9999") ("존 도" . "555-1212") ("J. 랜덤 해커" . "553-1337"))
구문(x . y)
ED 쌍을 나타내기 위해 사용된다.키와 값이 앨리스트 내에서 동일한 유형이 될 필요는 없다.Lisp 및 Scheme은 다음과 같은 운영자를 제공한다.assoc
연상 배열과 유사한 방법으로 연고를 조작하는 것.
연결 목록 처리와 관련된 일련의 작업이 Common Lisp에 대해 존재하며, 각각은 파괴되지 않고 작동한다.
항목을 추가하려면acons
기능이 사용되어 새 연결 목록을 만들고 반환함.Common Lisp의 연결 목록은 스택을 모방하며, 즉 LIFO(Last-in-First-out) 원칙을 준수하고, 따라서 목록 헤드에 선행한다.
(하게 하다 ((전화번호부 NIL)) (세트로 만들다 전화번호부 (에이콘 "샐리 스마트" "555-9999" 전화번호부)) (세트로 만들다 전화번호부 (에이콘 "존 도" "555-1212" 전화번호부)) (세트로 만들다 전화번호부 (에이콘 "J. 랜덤 해커" "555-1337" 전화번호부)))
이 기능은 다음을 위한 숙소로 해석될 수 있다.cons
작전[6]
;; 의 영향 ;; (핵심 가치에 대해 협의) ALIST) ;;;는 에 해당한다. ;; (핵심 값 ALIST) (하게 하다 ((전화번호부 '(("샐리 스마트" . "555-9999") ("존 도" . "555-1212")))) (단점 (단점 "J. 랜덤 해커" "555-1337") 전화번호부))
물론 파괴적인 것은push
또한 연결 목록에 항목을 삽입할 수 있으며, 이 항목은 매핑의 유효성을 유지하기 위해 키 값 단위를 구성해야 한다.
(밀다 (단점 "더미" "123-4567") 전화번호부)
해당 키로 항목을 검색하는 작업은 다음을 통해 수행됨assoc
테스트 술어와 방향에 대해 구성될 수 있으며, 특히 연결 목록을 끝에서 앞쪽으로 검색한다.결과는 긍정적이면 그 값뿐만 아니라 전체 엔트리 단위를 반환한다.일치하는 키 LED를 확보하지 못해NIL
가치를 매기다
(연상시키다 "존 도" 전화번호부 :테스트 #'끈=)
의 두 가지 일반화assoc
존재:assoc-if
각 항목의 키를 테스트하는 술어 함수를 예상하여 술어가 비논어를 생성하는 첫 번째 항목을 반환한다.NIL
호출에 따르다 assoc-if-not
논리를 반전시켜 동일한 인수를 허용하지만 첫 번째 항목 생성을 반환함NIL
.
;;; 키가 "존 도"와 같은 첫 번째 항목을 찾으십시오. (연상시키다 #'(람다 (핵심을) (끈= 핵심을 "존 도")) 전화번호부) ;; "Sally Smart" 또는 "John Doe" 키가 아닌 첫 번째 항목 찾기 (연관성이 없는 #'(람다 (핵심을) (회원 핵심을 '("샐리 스마트" "존 도") :테스트 #'끈=)) 전화번호부)
역 과정, 그 값에 의한 항목의 검출은 활용한다.rassoc
.
;;; 값이 "555-9999"인 첫 번째 항목을 찾으십시오. ;; "string=" 술어로 항목 문자열 값을 테스트한다. (연상시키다 "555-9999" 전화번호부 :테스트 #'끈=)
해당 일반화rassoc-if
그리고rassoc-if-not
존재하다
;;; 값이 "555-9999"인 첫 번째 항목을 찾는다. (rassociate-if #'(람다 (가치를 매기다) (끈= 가치를 매기다 "555-9999")) 전화번호부) ;;; 값이 "555-9999"가 아닌 첫 번째 항목을 찾는다. (rociation-if-not. #'(람다 (가치를 매기다) (끈= 가치를 매기다 "555-9999")) 전화번호부)
이전의 모든 엔트리 검색 기능은 다음과 같은 일반적인 목록 중심 변형으로 대체될 수 있다.find
,find-if
,find-if-not
, 그리고 다음과 같은 관련 기능들position
그리고 그 파생물들.
;;; 키 "John Doe"와 값 "555-1212"로 항목을 찾으십시오. (찾아내다 (단점 "존 도" "555-1212") 전화번호부 :테스트 #'대등하다)
구체적인 상대방식이 없는 삭제는 파괴적인 것을 포함한 리스트 설비에 근거한다.
;; 키가 "존 도(John Doe)"인 항목 없이 앨리스트를 만들고 반환하십시오. (제거하면 #'(람다 (입장권) (끈= (자동차 입장권) "존 도")) 전화번호부)
반복은 목록을 기대하는 모든 기능의 도움을 받아 이루어진다.
;;; "맵"을 통해 반복한다. (지도를 그리다 NIL #'(람다 (입장권) (파괴적인 (핵심을 . 가치를 매기다) 입장권 (형식을 갖추다 T "~&~s => ~s" 핵심을 가치를 매기다))) 전화번호부) ;;; "돌리기"를 통해 반복한다. (돌리스트 (입장권 전화번호부) (파괴적인 (핵심을 . 가치를 매기다) 입장권 (형식을 갖추다 T "~&~s => ~s" 핵심을 가치를 매기다)))
이러한 구조화된 목록, 처리 및 변환 작업은 제약 없이 적용될 수 있다.
;;; "전화 번호부" 값의 벡터를 반환한다. (지도를 그리다 'vector #'cdr 전화번호부) ;;; "map-into"를 통해 "phone-book"을 파괴적으로 수정한다. (지도에 표시된 전화번호부 #'(람다 (입장권) (파괴적인 (핵심을 . 가치를 매기다) 입장권 (단점 (역행의 핵심을) (역행의 가치를 매기다)))) 전화번호부)
선형의 성질 때문에, 연석은 상대적으로 작은 데이터 집합에 사용된다.Common Lisp은 해시 테이블 데이터 유형도 지원하며, Scheme의 경우 SRFI 69에서 구현된다.해시 테이블은 앨리스트보다 오버헤드가 크지만 요소가 많을 때 훨씬 빠른 액세스를 제공한다.또 다른 특징은 연결 리스트와 달리 Common Lisp 해시 테이블이 입력 삽입 순서를 유지하지 못한다는 점이다.
Common Lisp 해시 테이블은 다음을 통해 생성됨make-hash-table
함수의 인수에는 입력 키를 테스트하기 위한 술어가 포함된다.임의 객체, 심지어 단일 해시 테이블 인스턴스 내의 이질성을 허용하면서 이 키의 사양:test
기능은 구별 가능한 실체에 국한된다: 공통 리스프 표준은 단지 다음을 지원하도록 요구한다.eq
,eql
,equal
그리고equalp
그러나 추가 또는 사용자 지정 작업을 구체적인 구현에 허용 가능한 것으로 지정.
(하게 하다 ((전화번호부 (탁자를 맞추다 :테스트 #'대등하다))) (세트로 만들다 (겟하쉬 "샐리 스마트" 전화번호부) "555-9999") (세트로 만들다 (겟하쉬 "존 도" 전화번호부) "555-1212") (세트로 만들다 (겟하쉬 "J. 랜덤 해커" 전화번호부) "553-1337"))
그gethash
함수를 통해 키와 관련된 값을 얻을 수 있다.
(겟하쉬 "존 도" 전화번호부)
또한 키가 없는 경우 기본값을 지정할 수 있다.
(겟하쉬 "인코인키토" 전화번호부 '그런 건 안 돼')
의 호출.gethash
실제로 키의 값 또는 대체 값과 부울 표시기의 두 값을 반환한다.T
해시 테이블이 키를 포함하는 경우NIL
부재를 알리기 위해
(다중 가치관 (가치를 매기다 포함 키) (겟하쉬 "샐리 스마트" 전화번호부) (만일 포함 키 (형식을 갖추다 T "~&" 관련 값은: ~s" 가치를 매기다) (형식을 갖추다 T "~~•키를 찾을 수 없었다.")))
사용하다remhash
키와 관련된 항목을 삭제하는 경우
(재탕하다 "J. 랜덤 해커" 전화번호부)
clrhash
해시 테이블을 완전히 비운다.
(찰과상을 입다 전화번호부)
헌신적인 사람maphash
함수는 해시 테이블을 반복하는 것을 전문으로 한다.
(마파시 #'(람다 (핵심을 가치를 매기다) (형식을 갖추다 T "~&~s => ~s" 핵심을 가치를 매기다)) 전화번호부)
또는,loop
construct는 키, 값 또는 접속사 모두를 통해 반복에 대한 규정을 만든다.
;;; 해시 테이블의 키와 값을 반복한다. (고리를 틀다 을 위해 핵심을 존재 그 해시키 의 전화번호부 사용. (해시-값 가치를 매기다) 하다 (형식을 갖추다 T "~&~s => ~s" 핵심을 가치를 매기다)) ;;; 해시 테이블의 값을 반복한다. (고리를 틀다 을 위해 가치를 매기다 존재 그 해시파이로 만들다 의 전화번호부 하다 (인쇄하다 가치를 매기다))
추가 옵션이 실행되면with-hash-table-iterator
, 반복기 작성 매크로, 이 매크로의 처리가 발신자에 의해 추진되도록 되어 있다.
(테이블이 있는 편집기 (입국 신고서 전화번호부) (고리를 틀다 하다 (다중 가치관 (하스 엔트리의 핵심을 가치를 매기다) (입국 신고서) (만일 하스 엔트리의 (형식을 갖추다 T "~&~s => ~s" 핵심을 가치를 매기다) (고리타분한)))))
리스트, 어레이, 해시 테이블과 연계해 구조나 객체 지향 프로그래밍 기능을 이용해 복합 추상 데이터 유형을 Lisp에서 쉽게 구성할 수 있다.
LPC
LPC는 드라이버에 따라 "맵" 또는 "맵핑"으로 알려진 기본 유형으로 연관 배열을 구현한다.키와 값은 어떤 유형이든 될 수 있다.매핑 리터럴은 다음과 같이 기록된다.([ key_1 : value_1, key_2 : value_2 ])
. 절차 코드는 다음과 같다.
맵핑 phone_book = ([]); phone_book["샐리 스마트"] = "555-9999"; phone_book["존 도"] = "555-1212"; phone_book["J. 랜덤 해커"] = "555-1337";
매핑은 위에서와 같이 쓰기 위한 것과 같은 방법으로 인덱싱 연산자를 사용하여 읽기 위해 액세스된다.so1 phone_book["Sally Smart"]은 문자열 "555-99999"를 반환하고 phone_book["를 반환한다.John Smith"]는 0을 반환할 것이다.존재 여부 시험은 기능 부재()를 사용하여 수행한다.if(member(phone_book, "John Smith")) write("John Smith is listed.\n");
삭제는 드라이버에 따라 m_delete() 또는 map_delete()라는 함수를 사용하여 수행된다.m_delete(phone_book, "Sally Smart");
Amylaar 계열의 LPC 드라이버는 보조 숫자 인덱스를 사용하여 다중값 매핑을 구현한다(MudOS 계열의 다른 드라이버는 다중값 매핑을 지원하지 않음).구문 예제:
맵핑 phone_book = ([:2]); phone_book["샐리 스마트", 0] = "555-9999"; phone_book["샐리 스마트", 1] = "99 샤프웨이"; phone_book["존 도", 0] = "555-1212"; phone_book["존 도", 1] = "3 니그마 드라이브"; phone_book["J. 랜덤 해커", 0] = "555-1337"; phone_book["J. 랜덤 해커", 1] = 매사추세츠 가 77번지;
포라치() 구조를 지원할 수 있을 정도로 현대적인 LPC 드라이버는 그것을 그들의 매핑 유형을 통해 반복하는데 사용한다.
루아
루아에서 "테이블"은 배열(숫자 색인, 고속) 또는 연관 배열로 사용할 수 있는 기본 유형이다.
키와 값은 0을 제외한 모든 유형이 될 수 있다.다음은 비수적 지수에 초점을 맞춘다.
테이블 리터럴은 다음과 같이 쓰여진다.{ value, key = value, [index] = value, ["non id string"] = value }
. 예:
phone_book = { ["샐리 스마트"] = "555-9999", ["존 도"] = "555-1212", ["J. 랜덤 해커"] = "553-1337", -- 후행 쉼표 확인 } a테이블 = { -- 값으로서의 표 하위 테이블 = { 5, 7.5, k = 진실의 }, -- 핵심은 "하위 테이블" 입니다. -- 값으로서의 기능 ['존 도'] = 기능을 하다 (나이를 먹다) 만일 나이를 먹다 < 18 그때 돌아오다 "영" 다른 돌아오다 "올드!" 종지부를 찍다 종지부를 찍다, -- 테이블 및 기능(및 기타 유형)을 키로도 사용할 수 있음 }
키가 유효한 식별자(예약된 단어가 아님)인 경우 인용문을 생략할 수 있다.식별자는 대소문자를 구분한다.
조회는 항상 작동하는 대괄호 또는 식별자 키에만 적용되는 점 표기법을 사용하여 작성된다.
인쇄하다(a테이블["존 도"](45)) x = a테이블.하위 테이블.k
또한 모든 키 및 관련 값을 반복기 또는 loops:
소박한 = { [진실의] = 1, [거짓의] = 0, [3.14] = math.pi, x = 'x', ["!"] = 42 } 기능을 하다 FormatElement(핵심을, 가치를 매기다) 돌아오다 "[" .. 토스트링(핵심을) .. "] = " .. 가치를 매기다 .. ", " 종지부를 찍다 -- 모든 키에 반복 테이블.앞을 내다(소박한, 기능을 하다 (k, v) io.write(FormatElement(k, v)) 종지부를 찍다) 인쇄하다"" 을 위해 k, v 에 쌍들(소박한) 하다 io.write(FormatElement(k, v)) 종지부를 찍다 인쇄하다"" k= 못을 박다 되풀이하여 말하다 k, v = 다음에(소박한, k) 만일 k ~= 못을 박다 그때 io.write(FormatElement(k, v)) 종지부를 찍다 까지 k == 못을 박다 인쇄하다""
항목을 0으로 설정하여 제거할 수 있음:
소박한.x = 못을 박다
마찬가지로 값을 덮어쓰거나 추가할 수 있다.
소박한['%'] = "백분율" 소박한['!'] = 111
매스매티카어와 울프람어
Mathematica와 Wolfram Language는 연관 배열을 나타내기 위해 Association 식을 사용한다.[7]
전화번호부 = < "샐리 스마트" -> "555-9999", "존 도" -> "555-1212", "J. 랜덤 해커" -> "553-1337" >;
액세스 방법:[8]
전화번호부[[키["샐리 스마트"]]]
키가 문자열인 경우 키 키워드는 필요하지 않으므로:
전화번호부[["샐리 스마트"]]
키[전화 번호부] 값[전화 번호부]
덤프
MUMP에서 모든 배열은 연관 배열이다.연관 어레이에 대한 내장형 언어 수준의 직접 지원은 "로컬"이라고 불리는 메모리에 저장된 프로세스별 사설 어레이뿐만 아니라 디스크에 저장된 영구 공유 글로벌 어레이에도 적용되며, 여러 작업에 동시에 사용할 수 있다.글로브의 명칭은 국소변수와 구별하기 위해 곡절 "^"가 선행한다.
SET ^폰북("Sally Smart")="555-9999";;; 영구 데이터 SET 전화번호부("John Doe")="555-1212";; 임시 데이터 SET 전화번호부("J. Random Hacker")="553-1337";;; 임시 데이터 MERG ^폰북=폰북 ;;;;임시 데이터를 영구 데이터에 복사
요소의 값에 액세스하려면 다음 첨자와 함께 이름을 사용해야 한다.
"Phone Number :,"^Phonebook("Sally Smart"),!
다음과 같이 연결된 배열을 반복할 수도 있다.
SET NAME="FOR SNAME=$ORDER(^Phonebook(NAME)) 종료:NAME="" 쓰기 이름", 전화 번호 :",^Phonebook(NAME),!
목표-C(Cocoa/GNUstep)
목표-C로 작성된 코코아 및 GNUstep은 다음을 사용하여 연관 배열 처리NSMutableDictionary
(의 변이 가능한 버전)NSDictionary
) 클래스 클러스터.이 수업은 어떤 두 개의 사물 사이에 할당을 허용한다.키 오브젝트를 삽입하기 전에 해당 오브젝트의 복사본이 작성됨NSMutableDictionary
따라서, 키들은 반드시 에 부합되어야 한다.NSCopying
의전상의사전에 삽입될 때 값 개체는 참조 수를 늘리기 위해 보존 메시지를 수신한다.값 개체는 릴리스 메시지가 사전에서 삭제될 때(명시적으로 또는 동일한 키로 사전에 다른 개체를 추가하여) 릴리스 메시지를 수신한다.
NSMutableDictionary *에이디커리 = [[NSMutableDictionary 할당하다] 초기화하다]; [에이디커리 setObject:@"555-9999" 포키:@"Sally Smart"]; [에이디커리 setObject:@"555-1212" 포키:@"존도"]; [에이디커리 setObject:@"553-1337" 포키:@"랜덤 해커"];
할당된 개체에 액세스하려면 다음 명령을 사용하십시오.
id an Object = [에이디커리 objectForKey:@"Sally Smart"];
다음을 사용하여 모든 키 또는 값을 열거할 수 있음NSEnumerator
:
NSEnumerator *키에너메이터 = [에이디커리 키에너메이터]; id 핵심을; 하는 동안에 ((핵심을 = [키에너메이터 nextObject])) { // ... 여기서 처리... }
Mac OS X 10.5+ 및 iPhone OS에서는 를 사용하여 사전 키를 보다 간결하게 열거할 수 있다.NSFastEnumeration
구성:[11]
을 위해 (id 핵심을 에 에이디커리) { // ... 여기서 처리... }
훨씬 더 실용적이고 구조화된 데이터 그래프는 특히 코코아를 사용하여 쉽게 만들어질 수 있다.NSDictionary
(NSMutableDictionary
). 이는 다음과 같은 간단한 예를 통해 설명할 수 있다.
NSDectionary *에이디커리 = [NSDectionary 사전의WithObjects앤키스: [NSDectionary 사전의WithObjects앤키스: @"555-9999", @"Sally Smart", @"555-1212", @"존도", 못을 박다], @"students", [NSDectionary 사전의WithObjects앤키스: @"553-1337", @"랜덤 해커", 못을 박다], @"hackers", 못을 박다];
키 경로를 사용하여 관련 필드에 빠르게 액세스할 수 있음:
id an Object = [에이디커리 valueForKeyPath:@"190.샐리 스마트"];
OCAML
OCaml 프로그래밍 언어는 세 가지 서로 다른 연관 용기를 제공한다.가장 간단한 것은 쌍의 목록이다.
# 하게 하다 m = [ "샐리 스마트", "555-9999"; "존 도", "555-1212"; "J. 랜덤 해커", "553-1337"];; 발랄하게 하다 m : (끈을 매다 * 끈을 매다) 리스트를 작성하다 = [ ("샐리 스마트", "555-9999"); ("존 도", "555-1212"); ("J. 랜덤 해커", "553-1337") ] # 목록..연상시키다 "존 도" m;; - : 끈을 매다 = "555-1212"
두 번째는 다형 해시 테이블:
# 하게 하다 m = 해시블.만들다 3;; 발랄하게 하다 m : ('_a, '_b) 해시블.t = <기절시키다> # 해시블.덧셈을 m "샐리 스마트" "555-9999"; 해시블.덧셈을 m "존 도" "555-1212"; 해시블.덧셈을 m "J. 랜덤 해커" "553-1337";; - : 구성 단위 = () # 해시블.찾아내다 m "존 도";; - : 끈을 매다 = "555-1212"
위의 코드는 OCaml의 기본 해시 함수를 사용한다.Hashtbl.hash
는 모든 유형에 대해 자동으로 정의된다.수정된 해시 함수를 사용하려면 functor 인터페이스를 사용하십시오.Hashtbl.Make
와 같은 모듈을 만드는 것Map
.
마지막으로, 기능 맵(불변의 균형 이진 트리로 표현됨):
# 모듈 스트링맵 = 지도.만들다(끈);; ... # 하게 하다 m = 스트링맵.덧셈을 "샐리 스마트" "555-9999" 스트링맵.텅 빈 하게 하다 m = 스트링맵.덧셈을 "존 도" "555-1212" m 하게 하다 m = 스트링맵.덧셈을 "J. 랜덤 해커" "553-1337" m;; 발랄하게 하다 m : 끈을 매다 스트링맵.t = <기절시키다> # 스트링맵.찾아내다 "존 도" m;; - : 끈을 매다 = "555-1212"
참고: 사용하기 위해Map
functor를 제공해야 한다.Map.Make
키 유형과 비교 기능을 정의하는 모듈.타사 라이브러리 ExtLib는 기능 맵의 폴리모픽 버전을 제공하며,PMap
,[12] 생성 시 비교 함수를 부여한다.
쌍과 기능 맵의 목록은 둘 다 순전히 기능적인 인터페이스를 제공한다.이와는 대조적으로 해시 테이블은 필수 인터페이스를 제공한다.많은 연산의 경우, 해시 테이블은 페어 리스트나 기능 맵보다 상당히 빠르다.
옵티미제이
이 섹션은 검증을 위해 추가 인용구가 필요하다. 할 수 있음(2011년 2월) (이 및 |
OptimJ 프로그래밍 언어는 자바 5의 확장이다.Java와 마찬가지로 Optimj도 맵을 제공하지만 OptimJ도 진정한 연상 배열을 제공한다.Java 배열은 음이 아닌 정수로 색인화되며, 연관 배열은 모든 유형의 키로 색인화된다.
끈[끈] 전화번호부 = { "샐리 스마트" -> "555-9999", "존 도" -> "555-1212", "J. 랜덤 해커" -> "553-1337" }; // 문자열[String]은 자바 유형이 아니라 최적j 유형: // 문자열로 인덱싱된 문자열의 연관 배열. // 값을 반복한다. 을 위해(끈 번호를 붙이다 : 전화번호부) { 시스템.밖으로.인쇄하다(번호를 붙이다); } // 이전 진술: "555-9999" "555-1212" "553-1337" // 키에 반복 을 위해(끈 이름을 붙이다 : 전화번호부.열쇠들.) { 시스템.밖으로.인쇄하다(이름을 붙이다 + " -> " + 전화번호부[이름을 붙이다]); } // phoneBook[name] 키를 사용하여 값 액세스(Java 어레이 액세스처럼 나타남) // 즉, 전화번호부["John Doe"] 반환 "555-1212"
물론 다차원 배열 정의, 자바 배열과 연관 배열의 혼합, 지도와 연관 배열의 혼합도 가능하다.
인트로[끈][][곱절로 하다] a; 자바를 만들다.이용하다.지도<끈[오브젝트], 정수> b;
펄 5
Perl 5는 연관 배열을 위한 언어 수준의 지원을 내장하고 있다.Modern Perl은 연관 배열들을 해시라고 부른다; 연관 배열이라는 용어는 오래된 문서들에서 발견되지만 다소 오래된 것으로 여겨진다.펄 5 해시는 평평하다. 키는 문자열이고 값은 스칼라다.단, 배열 또는 기타 해시 및 표준 Perl 5 모듈 Tie에 대한 참조 값일 수 있다.:RefHash는 해시를 참조 키와 함께 사용할 수 있도록 한다.
해시 변수는 a로 표시된다.%
sigil(시그릴), 스칼라, 배열 및 기타 데이터 유형과 구분.해시 리터럴은 Perl의 값을 사용하여 선호하는 형식을 가진 키 값 목록이다.=>
의미론적으로 대부분 쉼표와 동일하고 키-값 연결을 명확하게 하는 토큰:
나의 %phone_book = ( '샐리 스마트' => '555-9999', '존 도' => '555-1212', 'J. 랜덤 해커' => '553-1337', );
구문을 사용하는 해시 요소 액세스$hash_name{$key}
– 키는 곱슬 브레이스로 둘러싸여 있고 해시 이름은 a로 접두사가 되어 있다.$
, 해시의 일부임에도 불구하고 해시 요소 자체가 스칼라 값임을 나타낸다.의 가치$phone_book{'John Doe'}
이다'555-1212'
. The%
sigil은 해시를 전체적으로 언급할 때만 사용되는데, 예를 들어, 요청했을 때 입니다.keys %phone_book
.
내장된 기능을 사용하여 키 및 값 목록을 추출할 수 있음keys
그리고values
각각,예를 들어 해시의 모든 키를 인쇄하려면:
앞을 내다 달러명 (열쇠들. %phone_book) { 인쇄하다 달러명, "\n"; }
를 사용하여 (키, 값) 쌍을 반복할 수 있다.each
함수:
하는 동안에 ((달러명, 달러 수) = 각각 %phone_book) { 인쇄하다 '의 숫자', 달러명, ': ', 달러 수, "\n"; }
해시를 가리키는 스칼라 값인 해시 "참조"는 구분 기호로 곱슬 브레이스를 사용하여 리터럴 형식으로 지정되며, 다른 구문은 해시 리터럴을 지정하는 것과 유사하다.
나의 $phone_book = { '샐리 스마트' => '555-9999', '존 도' => '555-1212', 'J. 랜덤 해커' => '553-1337', };
해시 참조의 값은 비참조 연산자를 사용하여 액세스한다.
인쇄하다 $phone_book->{'샐리 스마트'};
해시 참조에 포함된 해시를 전체로서 참조할 필요가 있을 때keys
함수, 구문은 다음과 같다.
앞을 내다 달러명 (열쇠들. %{$phone_book}) { 인쇄하다 '의 숫자', 달러명, ': ', $phone_book->{달러명}, "\n"; }
펄 6 (라쿠)
"Raku"로 이름이 바뀐 Perl 6은 해시 또는 " 연관" 역할을 수행하는 개체로 언급되는 연관 배열의 언어 수준 지원도 내장되어 있다.Perl 5에서와 같이 Perl 6 기본 해시는 평평하며, 키는 문자열이고 값은 스칼라이다.모든 키를 문자열에 자동으로 강제하지 않도록 해시를 정의할 수 있다. 이러한 해시의 키는 문자열이 아닌 원래 개체로 남아 있기 때문에 "개체 해시"라고 한다.
해시 변수는 일반적으로 다음과 같이 표시된다.%
시그닐, 스칼라, 배열 및 기타 데이터 유형과 시각적으로 구별하고 반복에 대한 동작을 정의한다.해시 리터럴은 Perl의 값을 사용하여 선호하는 형식을 가진 키 값 목록이다.=>
키-값 연결을 보다 명확하게 하는 토큰:
내 %phone-book = 'Sally Smart' => '555-99999', 'John Doe' => '555-1212', 'J. Random Hacker' => '553-1337',;
구문을 사용하는 해시 요소 액세스%hash_name{$key}
– 키는 곱슬브레이스와 해시 이름으로 둘러싸여 있다(Perl 5와는 반대로 시그널은 변하지 않는다).의 가치%phone-book{'John Doe'}
이다'555-1212'
.
내장된 기능을 사용하여 키 및 값 목록을 추출할 수 있음keys
그리고values
각각,예를 들어 해시의 모든 키를 인쇄하려면:
%phone-book용.키 -> $name { say $name; }
기본적으로 해시를 통해 반복할 때 키-값 쌍을 얻는다.
%phone-book -> $entry에 대해 {$entry.key(): $entry.value()라고 말함; # 확장 보간 기능 사용 }
또한 를 사용하여 키 값과 값 값을 교대로 얻을 수도 있다.kv
방법:
%phone-book.kv -> $name의 경우 $number {는 $name: $number"; }
라쿠는 아무런 언급도 없다.해시는 평평하지 않은 단일 매개변수로 전달될 수 있다.서브루틴이 해시만 허용하는지 확인하려면 시그니처에 % 시그닐을 사용하십시오.
하위 목록 전화번호부(%pb) {%pb.kv -> $name에 대해, $number { number for $name: $number"; } } 목록 전화 번호부(%전화 번호부);
점진적 타이핑을 준수하여 해시는 형식 제약 조건을 적용하여 유효한 키 집합을 특정 형식에 국한시킬 수 있다.
# 키가 정수("Int" 유형)만 될 수 있는 해시를 정의한다.my %properties이름 포함{Int}; # 키는 이 경우처럼 정수여야 함. %numberWithNames.push(1 => "one"); # 이 경우 키 문자열이 잘못되어 오류가 발생함. %numberNames.push("key" => "2" 포함);
PHP
PHP의 내장 배열 유형은 실제로는 연관 배열이다.숫자 인덱스를 사용할 때도 PHP는 배열을 연관 배열로 내부적으로 저장한다.[13]따라서 PHP는 연속적으로 숫자로 인덱싱되지 않은 배열을 가질 수 있다.키는 정수(변동점 번호가 정수로 잘림) 또는 문자열 유형이어야 하며, 값은 다른 배열과 객체를 포함한 임의 유형일 수 있다.어레이는 이기종이다. 단일 어레이는 다른 유형의 키를 가질 수 있다.PHP의 연관 배열은 PHP에 내장되지 않은 트리, 목록, 스택, 대기열 및 기타 공통 데이터 구조를 나타내기 위해 사용될 수 있다.
연관 배열은 다음 구문을 사용하여 선언할 수 있다.
$Phonebook = 배열하다(); $Phonebook['샐리 스마트'] = '555-9999'; $Phonebook['존 도'] = '555-1212'; $Phonebook['J. 랜덤 해커'] = '555-1337'; // 또는 $Phonebook = 배열하다( '샐리 스마트' => '555-9999', '존 도' => '555-1212', 'J. 랜덤 해커' => '555-1337', ); // 또는 PHP 5.4 기준 $Phonebook = [ '샐리 스마트' => '555-9999', '존 도' => '555-1212', 'J. 랜덤 해커' => '555-1337', ]; // 또는 $Phonebook['contacts']['샐리 스마트']['숫자'] = '555-9999'; $Phonebook['contacts']['존 도']['숫자'] = '555-1212'; $Phonebook['contacts']['J. 랜덤 해커']['숫자'] = '555-1337';
PHP는 다음과 같이 연관 배열을 통해 루프할 수 있다.
앞을 내다 ($Phonebook 로서 달러명 => 달러 수) { 메아리치다 '의 숫자', 달러명, ': ', 달러 수, "\n"; } // 마지막 배열 예제의 경우 다음과 같이 사용된다. 앞을 내다 ($Phonebook['contacts'] 로서 달러명 => $num) { 메아리치다 '이름: ' ', 달러명, ', 숫자: ', $num['숫자'], "\n"; }
PHP는 어레이에서 작동할 수 있는 광범위한 기능을 가지고 있다.[14]
문자열과 정수 대신 객체를 키로 사용할 수 있는 연관 배열은SplObjectStorage
표준 PHP 라이브러리(SPL)의 클래스.[15]
파이크
Pike는 매핑이라고 하는 연관 배열의 지원을 내장하고 있다.매핑은 다음과 같이 작성된다.
맵핑(끈을 매다:끈을 매다) 전화번호부 = ([ "샐리 스마트":"555-9999", "존 도":"555-1212", "J. 랜덤 해커":"555-1337" ]);
매핑의 존재에 대한 액세스 및 테스트는 인덱싱 연산자를 사용하여 수행된다.그렇게phonebook["Sally Smart"]
그 끈을 돌려줄 것이다."555-9999"
그리고phonebook["John Smith"]
0을 반환할 것이다.
매핑을 통한 반복은 다음을 사용하여 수행할 수 있다.foreach
:
앞을 내다(전화번호부; 끈을 매다 핵심을; 끈을 매다 가치를 매기다) { 글씨를 쓰다("%s:%s"\n", 핵심을, 가치를 매기다); }
또는 반복기 개체 사용:
매핑.반복기 i = get_iterator(전화번호부); 하는 동안에 (i->색인을 달다()) { 글씨를 쓰다("%s:%s"\n", i->색인을 달다(), i->가치를 매기다()); i->다음에(); }
다음을 사용하여 매핑 요소를 제거할 수 있음m_delete
제거된 인덱스의 값을 반환하는 위치:
끈을 매다 sallys_number = m_delete(전화번호부, "샐리 스마트");
포스트스크립트
PostScript에서 연관 배열은 사전이라고 불린다.레벨 1 PostScript에서 명시적으로 작성해야 하지만 레벨 2는 이중 앵글-브래킷 구문을 사용한 직접 선언을 도입했다.
% 레벨 1 선언 3 받아쓰게 하다 속이다 시작되다 /빨간색 (iii) 반항하다 /녹색 (거꾸다) 반항하다 /파란색 (블루) 반항하다 종지부를 찍다 % 레벨 2 선언 << /빨간색 (회전) /녹색 (그루엔) /파란색 (블라우) >> % 두 방법 모두 피연산자 스택에 사전을 남겨둠
사전은 다음을 사용하여 직접 액세스할 수 있다.get
, 또는 암시적으로, 사전 스택에 사전을 배치하여begin
:
이전 두 사전이 여전히 피연산자 스택에 있는 경우 % /빨간색 얻다 인쇄하다 % 출력 '회전' 시작되다 푸르른 인쇄하다 % 출력 'vert' 종지부를 찍다
사전 내용은 다음을 통해 반복될 수 있음forall
, 특별한 순서는 아니지만:
% 레벨 2 예제 << /이것 1 /그것 2 /기타 3 >> {교환하다 =인쇄 ( is ) 인쇄하다 ==} 전부
출력 가능한 항목:
저것 이다 2 이것 이다 1 기타 이다 3
사전은 (레벨 1에서만 정의되는 크기까지) 증분 또는 변경될 수 있다.put
, 그리고 다음을 사용하여 항목을 제거할 수 있다.undef
:
%는 쉽게 재사용할 수 있도록 사전 정의: /MyDict << /message (빨간색) /vert (그루엔) >> 반항하다 % 추가 마이딕트 /bleu (파란색) 놓다 % 변경 마이딕트 /vert (녹색) 놓다 제거율(%) 마이딕트 /message 정의를 내리지 않다
서언, 머리말
Prolog의 일부 버전에는 사전("dict") 유틸리티가 포함되어 있다.[16]
파이톤
Python에서는 연관 배열들을 "사전"이라고 부른다.사전 리터럴은 구불구불한 교정기로 구분된다.
전화번호부 = { "샐리 스마트": "555-9999", "존 도": "555-1212", "J. 랜덤 해커": "553-1337", }
Python에서 항목에 액세스하려면 어레이 인덱싱 연산자를 사용하십시오.
>>> 전화번호부["샐리 스마트"] '555-9999'
사전의 모든 키를 반복하여 반복:
>>> 을 위해 핵심을 에 전화번호부: ... 인쇄하다(핵심을, 전화번호부[핵심을]) 샐리 똑똑한 555-9999 J. 무작위 해커 553-1337 존 도 555-1212
반복(키, 값) 튜플:
>>> 을 위해 핵심을, 가치를 매기다 에 전화번호부.항목들(): ... 인쇄하다(핵심을, 가치를 매기다) 샐리 똑똑한 555-9999 J. 무작위 해커 553-1337 존 도 555-1212
사전 키는 를 사용하여 개별적으로 삭제할 수 있다.del
명세서해당 값은 "dict" 유형의 "pop" 방법을 사용하여 키 값 쌍을 삭제하기 전에 반환할 수 있다.
>>> 굴을 파다 전화번호부["존 도"] >>> 발랄하게 하다 = 전화번호부.펑펑 터지다("샐리 스마트") >>> 전화번호부.열쇠들.() # 열쇠 하나만 남았다. ['J. 랜덤 해커']
Python 2.7 및 3.x는 또한 사전 목록 이해를 지원하는데, 이는 모든 반복기에서 사전을 생성하기 위한 콤팩트한 구문이다.
>>> square_square = {i: i*i 을 위해 i 에 범위(5)} >>> square_square {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} >>> {핵심을: 가치를 매기다 을 위해 핵심을, 가치를 매기다 에 전화번호부.항목들() 만일 "J" 에 핵심을} {'J. 랜덤 해커': '553-1337', '존 도': '555-1212'}
엄격히 말하면, 사전은 키나 값이 단일 데이터 유형으로 제한되지 않기 때문에 연관 배열의 슈퍼셋이다.사전은 파이썬이라는 명칭을 사용한 '연관 목록'으로 생각할 수 있다.예를 들면 다음과 같은 것도 합법적이다.
전화번호부 = { "샐리 스마트": "555-9999", "존 도": 없음, "J. 랜덤 해커": -3.32, 14: "555-3322", }
사전 키는 불변의 데이터 유형이어야 한다.파이톤에서는 문자열의 구현방법으로 인해 불변한다.
빨간색
In Red the Redmap!
[17] 데이터 유형은 단어, 문자열 및 스칼라 키 유형의 값을 모든 유형의 값에 매핑하는 연관 배열을 제공한다.해시 테이블은 조회를 위해 내부적으로 사용된다.
지도는 다음과 같이 문자 그대로 쓸 수 있다.#(key1 value1 key2 value2 ...)
또는 다음을 사용하여 만들 수 있음make map! [key1 value1 key2 value2 ...]
:
빨강 [제목:"내 지도"] my-map: 만들다 지도! [ "샐리 스마트" "555-9999" "존 도" "555-1212" "J. 랜덤 해커" "553-1337" ] ; 키와 값 둘 다 대소문자를 보존하지만 룩업은 기본적으로 대소문자를 구분하지 않으며, <코드> 선택과 <코드> 입력에 대해 <코드>/케이스</코드> 미세화를 사용하여 대소문자를 구분할 수 있다. ; 물론 <코드>단어를 사용하는 것도 가능하다!</code> 값을 키로 하여, 일반적으로 <code>set-word!지도를 만들 때 </code> 값을 쓰지만, 어떤 단어든 조회나 생성에 사용할 수 있다. my-other-map: 만들다 지도! [foo: 42 막대: 거짓의] ; 블록이 어떠한 방식으로도 감소되거나 평가되지 않으므로 위의 예에서 키 <코드>바(/code)는 <코드> 워드와 연관되어 있다는 점에 유의하십시오!<암호>보다 <암호> 거짓!</code> 값 false, 후자를 원할 경우 문자 그대로 구문을 사용할 수 있다. my-other-map: 만들다 지도! [foo: 42 막대: #[거짓의]] ; 또는 생성 후 키를 추가할 수 있음: my-other-map: 만들다 지도! [foo: 42] 다른 지도/bar: 거짓의 ; 검색은 <코드> 경로를 이용하여 작성할 수 있다!</code> 표기법 또는 <code> 선택 동작 사용: 선발하다 마이맵 "샐리 스마트" 다른 지도/foo ; 다음과 같이 <코드>예측을 통해 모든 키와 값을 반복할 수도 있다. 앞을 내다 [핵심을 가치를 매기다] 마이맵 [ 인쇄하다 [핵심을 "관련됨" 가치를 매기다] ] ; 키는 다음과 같이 <코드>제거/키를 사용하여 제거할 수 있다. 제거하다/key 마이맵 "샐리 스마트"
REXX
REXX에서 연관 배열은 "stem variables" 또는 "Compound variables"라고 불린다.
KEY = 'Sally Smart' PHANNEBOOK.KEY = '555-99999' KEY = 'John Doe' PHANNEBOOK.키 = '555-1212' 키 = 'J. 랜덤 해커' 폰북키 = '553-1337'
숫자 키가 있는 줄기 변수는 일반적으로 1에서 시작하여 위에서 위로 이동한다.관례에 따른 0-키 스템 변수는 스템의 총 항목 수를 포함한다.
NAME.1 = 'Sally Smart' NAME.2 = 'John Doe' NAME.3 = 'J. Random Hacker' NAME.0 = 3
REXX는 줄기 변수의 키에 자동으로 액세스하는 쉬운 방법이 없으며, 일반적으로 키는 숫자 키와 함께 별도의 연관 배열로 저장된다.
루비
루비에서는 다음과 같이 해시 테이블을 사용한다.
irb(main):001:0>전화번호부 = { irb(main):002:1*'샐리 스마트' => '555-9999', irb(main):003:1*'존 도' => '555-1212', irb(main):004:1*'J. 랜덤 해커' => '553-1337' irb(main):005:1>} => {"Sally Smart"="555-9999", "John Doe"="555-1212", "J. Random Hacker"="553-1337"} irb(main):006:0>전화번호부['존 도'] => "555-1212"
Ruby는 다음과 같은 구문을 사용하여 해시 루프 및 반복을 지원한다.
irb(main):007:0>### 키와 값에 반복 irb(메인):008:0*전화번호부.각각 { 핵심을, 가치를 매기다 놓다 핵심을 + " => " + 가치를 매기다} 샐리 스마트 => 555-99999 신원미상 => 555-1212 J. 랜덤 해커 => 553-1337 => {"Sally Smart"="555-9999", "John Doe"="555-1212", "J. Random Hacker"="553-1337"} irb(main):009:0>### 키만 반복 irb(main):010:0*전화번호부.각_key { 핵심을 놓다 핵심을} 샐리 스마트 존 도 J. 랜덤 해커 => {"Sally Smart"="555-9999", "John Doe"="555-1212", "J. Random Hacker"="553-1337"} irb(main):011:0>### 값만 반복 irb(main):012:0*전화번호부.every_value { 가치를 매기다 놓다 가치를 매기다} 555-9999 555-1212 553-1337 => {"Sally Smart"="555-9999", "John Doe"="555-1212", "J. Random Hacker"="553-1337"}
루비는 해시 병합, 일부 기준에 맞는 요소 선택 또는 거부, 뒤집기(키와 값 교환), 해시를 배열로 평탄화하는 등 해시에 대한 많은 다른 유용한 연산도 지원한다.
녹
러스트 표준 라이브러리는 해시 맵을 제공한다(std::collections::HashMap
) 및 B-트리 지도().std::collections::BTreeMap
) 그들은 같은 이름을 가진 여러 가지 방법을 공유하지만, 삽입할 수 있는 키의 종류에 대한 요구사항은 다르다.그HashMap
구현하기 위한 키 필요Eq
(영문 관계) 및Hash
(유효성) 특징과 그것은 불특정 순서대로 항목을 저장하고,BTreeMap
을 필요로 하다Ord
(전체 순서) 특성 및 키 유형에 의해 정의된 순서에 따라 항목을 저장한다.순서는 기본 반복자가 반영한다.
std::csv::: 사용:HashMap; let mut phone_book = HashMap::new(), phone_book.insert("Sally Smart", "555-99999"), phone_book.insert("John Doe", "555-1212"), phone_book.inserther("),
기본 반복자는 튜플로 모든 항목을 방문한다.그HashMap
반복자는 지정되지 않은 순서대로 항목을 방문하며BTreeMap
반복자가 키 유형에 의해 정의된 순서대로 항목을 방문한다.
을 위해 (이름을 붙이다, 번호를 붙이다) 에 &phone_book { 인쇄하다!("{} {}", 이름을 붙이다, 번호를 붙이다); }
키에 대한 반복기도 있다.
을 위해 이름을 붙이다 에 phone_book.열쇠들.() { 인쇄하다!("{}", 이름을 붙이다); }
에스랑
S-Lang에는 다음과 같은 연관 배열 유형이 있다.
전화번호부 = Association_유형[]; 전화번호부["Sally Smart"] = "555-99999" 전화번호부["John Doe] = "555-1212" 전화번호부["J. 랜덤 해커"] = "555-1337"
여러 가지 방법으로 연결된 배열을 반복할 수도 있다.
이름(전화 번호부) { vmessage("%s %s", 이름, 전화번호부[이름]); }
정렬된 목록을 인쇄하려면 표준 어레이에 대한 S-랑의 강력한 지원을 활용하는 것이 좋다.
키 = association_get_keys(전화 번호부), i = array_sort(키), vals = association_get_values(전화 번호부), array_map(Void_유형, &vmessage, "%s %s", 키[i], vals[i];
스칼라
스칼라는 불변성을 제공한다.Map
의 일부로 분류하다scala.collection
프레임워크:
발랄하게 하다 전화번호부 = 지도("샐리 스마트" -> "555-9999", "존 도" -> "555-1212", "J. 랜덤 해커" -> "553-1337")
스칼라의 유형 추론은 이것이 '이것'이라고 결정하게 될 것이다.Map[String, String]
. 어레이에 액세스하려면:
전화번호부.얻다("샐리 스마트")
이것은 a를 반환한다.Option
스칼라가 하스켈의 모나드에 해당하는 유형이야
스몰토크
스몰토크에서 aDictionary
사용:
전화번호부 := 사전 새로운. 전화번호부 다음 날짜: '샐리 스마트' 다음 항목을 입력하십시오. '555-9999'. 전화번호부 다음 날짜: '존 도' 다음 항목을 입력하십시오. '555-1212'. 전화번호부 다음 날짜: 'J. 랜덤 해커' 다음 항목을 입력하십시오. '553-1337'.
항목에 액세스하려면 메시지#at:
사전 개체로 전송됨:
전화번호부 다음 날짜: '샐리 스마트'
다음과 같은 이점을 얻을 수 있다.
'555-9999'
사전은 동일성에 기초하여 해시하거나 비교하며 키와 값을 모두 강력한 참조로 표시한다.해시/비교하는 ID(IdentityDictionary) 또는 약한 참조(WeakKeyDictionary/LeginValueDictionary)가 있는 변형들이 존재한다.모든 물체는 #해시를 구현하기 때문에, 어떤 물체는 키(물론 가치로도 사용될 수 있다.
속물
GROPTOL은 연관 배열을 사용한 최초의 프로그래밍 언어 중 하나이다.GROPTOL에서 연상 배열을 표라고 한다.
전화번호부 = 테이블() 전화번호부['샐리 스마트'] = '555-9999' 전화번호부['존 도'] = '555-1212' 전화번호부['J. 랜덤 해커'] = '553-1337'
표준 ML
표준 ML 프로그래밍 언어의 SML'97 표준은 연관 용기를 제공하지 않는다.그러나 표준 ML의 다양한 구현은 연관 용기를 제공한다.
인기 있는 뉴저지 표준 ML (SML/NJ) 구현의 라이브러리는 서명(일부 "인터페이스"와 같은)을 제공한다.ORD_MAP
순서가 지정된 기능(불가능한) 연관 배열의 공통 인터페이스를 정의한다.몇 가지 일반적인 요인이 있다.BinaryMapFn
,ListMapFn
,RedBlackMapFn
그리고SplayMapFn
—키 유형과 비교기를 설명하기 위해 사용자 정의 구조를 사용하여 해당 유형의 순서형 맵(유형들은 각각 자체 계산된 이진 검색 트리, 정렬된 연결 목록, 적색-흑색 트리, splay 트리)을 생성할 수 있다.functor는 다음 조건에 따라 구조물을 반환한다.ORD_MAP
접점또한 정수 키를 사용하는 연관 배열을 위한 두 개의 사전 정의된 모듈이 있다.IntBinaryMap
그리고IntListMap
.
- 구조화하다 스트링맵 = 바이너리맵Fn (구조상의 타자를 치다 ord_key = 끈을 매다 발랄하게 하다 비교하다 = 끈.비교하다 종지부를 찍다); 구조화하다 스트링맵 : ORD_MAP - 발랄하게 하다 m = 스트링맵.삽입하다 (스트링맵.텅 빈, "샐리 스마트", "555-9999") 발랄하게 하다 m = 스트링맵.삽입하다 (m, "존 도", "555-1212") 발랄하게 하다 m = 스트링맵.삽입하다 (m, "J. 랜덤 해커", "553-1337"); 발랄하게 하다 m = T {씨앤트=3,핵심을="존 도", 남겨진=T {씨앤트=1,핵심을="J. 랜덤 해커",남겨진=E,맞다=E,가치를 매기다="553-1337"}, 맞다=T {씨앤트=1,핵심을="샐리 스마트",남겨진=E,맞다=E,가치를 매기다="555-9999"}, 가치를 매기다="555-1212"} : 끈을 매다 스트링맵.지도를 그리다 - 스트링맵.찾아내다 (m, "존 도"); 발랄하게 하다 그럭저럭 = 일부 "555-1212" : 끈을 매다 옵션
또한 SML/NJ는 다형 해시 테이블을 제공한다.
- 예외적인 찾을 수 없음; 예외적인 찾을 수 없음 - 발랄하게 하다 m : (끈을 매다, 끈을 매다) 해시테이블.hash_table = 해시테이블.mkTable (해시스트링.해시스트링, op=) (3, 찾을 수 없음); 발랄하게 하다 m = HT {eq_message=fn,hash_fn=fn,n_bea=참조하다 0,not_found=찾을 수 없음(-), 테이블=참조하다 [NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,... ]} : (끈을 매다,끈을 매다) 해시테이블.hash_table - 해시테이블.삽입하다 m ("샐리 스마트", "555-9999"); 발랄하게 하다 그럭저럭 = () : 구성 단위 - 해시테이블.삽입하다 m ("존 도", "555-1212"); 발랄하게 하다 그럭저럭 = () : 구성 단위 - 해시테이블.삽입하다 m ("J. 랜덤 해커", "553-1337"); 발랄하게 하다 그럭저럭 = () : 구성 단위 해시테이블.찾아내다 m "존 도"; (*을(를) 찾을 수 없으면 없음 반환 없음 *) 발랄하게 하다 그럭저럭 = 일부 "555-1212" : 끈을 매다 옵션 - 해시테이블.찾다 m "존 도"; (*를 찾을 수 없는 경우 예외 발생*) 발랄하게 하다 그럭저럭 = "555-1212" : 끈을 매다
단형 해시 테이블도 지원되며, 이 표는HashTableFn
펑터
또 다른 표준 ML 구현인 Moscow ML도 일부 연관 용기를 제공한다.첫째로, 다형 해시 테이블을 제공한다.Polyhash
구조화하다또한, 위의 SML/NJ 라이브러리의 일부 기능 맵은 다음과 같이 이용할 수 있다.Binarymap
,Splaymap
그리고Intmap
구조물들
Tcl
연관 배열 의미론을 지원하는 Tcl 시설은 2개다."어레이"는 변수의 집합이다."독점"은 연관 배열의 완전한 구현이다.
배열하다
{전화북(Sally Smart)} 설정 555-99999 설정 존 {John Doe} 설정 전화북($john) 555-1212 설정 {전화북(J. Random Hacker)} 553-1337
변수 이름에 공백 문자가 있는 경우, 이름은 곱슬 괄호(대체 수행되지 않음) 또는 큰따옴표(대체 수행되지 않음)를 사용하여 그룹화해야 한다.
또는 매핑을 목록으로 표시하여 하나의 명령어로 여러 배열 요소를 설정할 수 있다(공백 포함 단어).
어레이 집합 전화번호부 [list {Sally Smart} 555-99999 {John Doe} 555-1212 {J. Random Hacker} 553-1337]
하나의 어레이 항목에 액세스하여 표준 출력에 저장하려면:
$Phonebook(Sally\ Smart)을 넣으십시오.
이 결과를 반환하는 방법:
555-9999
전체 배열을 사전으로 검색하려면:
배열 전화번호부 가져오기
결과는 다음과 같을 수 있다(키 순서가 지정되지 않음, 사전의 순서가 지정되지 않았기 때문이 아니라 배열의 순서가 지정되지 않았기 때문).
{Sally Smart} 555-9999 {J. 랜덤 해커} 553-1337 {John Doe} 555-1212
받아쓰게 하다
전화 번호부 설정 [dict create {Sally Smart} 555-9999 {John Doe} 555-1212 {J. Random Hacker} 553-1337]
항목을 검색하려면:
전화 번호부 받기 {존 도}
받아쓰기를 통해 반복하려면:
{name number} $Phonebook {put "name: $name\nnnumber: $number" }
비주얼 베이직
Visual Basic은 Microsoft Scripting Runtime(Visual Basic 6과 함께 제공되는)에서 사전 클래스를 사용할 수 있다.모든 버전에 공통적인 표준 구현은 없다.
' SCRRUN에 대한 참조가 필요하다.프로젝트 속성의 DLL 어둡다 전화번호부 로서 새로 만들기 사전 전화번호부.추가하다 "샐리 스마트", "555-9999" 전화번호부.항목("존 도") = "555-1212" 전화번호부("J. 랜덤 해커") = "553-1337" 을 위해 각각의 이름을 붙이다 인 전화번호부 MsgBox 이름을 붙이다 & " = " & 전화번호부(이름을 붙이다) 다음
비주얼 베이직네트
Visual Basic 입니다.NET는 에 의해 제공된 수집 클래스를 사용한다.NET Framework.
창조
다음 코드는 사전의 생성 및 모집단을 보여준다(추가 정보는 이 페이지의 C# 예 참조).
어둡다 미끼의 로서 새로 만들기 시스템.컬렉션.포괄적인.사전(중에서 끈, 끈) 미끼의.추가하다("샐리 스마트", "555-9999") 미끼의("존 도") = "555-1212" 미끼의.항목("J. 랜덤 해커") = "553-1337"
대체 구문은 수집 이니셜라이저를 사용하는 것으로, 수집 이니셜라이저를 사용하는 것으로, 수집 이니셜라이저는 다음과 같은 개별 통화로 압축된다.Add
:
어둡다 미끼의 로서 새로 만들기 시스템.컬렉션.사전(중에서 끈, 끈) 보낸 사람 { {"샐리 스마트", "555-9999"}, {"존 도", "555-1212"}, {"J. 랜덤 해커", "553-1337"} }
키로 액세스
액세스 시연 예(C# 액세스 참조):
어둡다 샐리넘버 = 미끼의("샐리 스마트") ' 또는 어둡다 샐리넘버 = 미끼의.항목("샐리 스마트")
어둡다 결과 로서 끈 = 아무 것도 없어요. 어둡다 샐리넘버 = 만약(미끼의.TryGetValue("샐리 스마트", 결과), 결과, "n/a")
열거
열거 예시(#C# 열거 참조):
'모음을 반복하고 각 항목을 표시한다. 을 위해 각각의 kvp 로서 키밸류페어(중에서 끈, 끈) 인 미끼의 콘솔.WriteLine("{0}의 전화 번호는 {1}", kvp.키, kvp.가치) 다음
Windows PowerShell
다른 많은 명령줄 인터프리터와는 달리 Windows PowerShell은 연관 어레이를 정의하기 위한 언어 레벨 지원을 내장하고 있다.
$Phonebook = @{ '샐리 스마트' = '555-9999'; '존 도' = '555-1212'; 'J. 랜덤 해커' = '553-1337' }
JavaScript에서처럼 속성 이름이 유효한 식별자인 경우 인용문을 생략할 수 있다.
$MyOtherObject = @{ foo = 42; 술집을 내다 = $false }
항목은 세미콜론 또는 줄바꿈으로 구분할 수 있다.
$MyOtherObject = @{ foo = 42 술집을 내다 = $false ; 재즈를 뿌리다 = 3 }
$now = [날짜 시간]::지금 내일 달러 = $now.AddDays(1) $ProcessDeletionSchedule = @{ (프로세스 가져오기 메모장) = $now (프로세스 가져오기 계산하다) = 내일 달러 }
또한 빈 연결 배열을 만들고 단일 항목 또는 다른 연결 배열을 나중에 추가할 수도 있다.
$Phonebook = @{} $Phonebook += @{ '샐리 스마트' = '555-9999' } $Phonebook += @{ '존 도' = '555-1212'; 'J. 랜덤 해커' = '553-1337' }
어레이 인덱스 연산자, 속성 연산자 또는 를 사용하여 새 항목을 추가할 수도 있음Add()
기초의 방법NET 개체:
$Phonebook = @{} $Phonebook['샐리 스마트'] = '555-9999' $Phonebook.'존 도' = '555-1212' $Phonebook.추가하다('J. 랜덤 해커', '553-1337')
할당된 개체, 어레이 인덱스 연산자, 속성 연산자 또는 매개 변수화된 속성을 취소하려면 다음과 같이 하십시오.Item()
의NET 개체를 사용할 수 있음:
$Phonebook['샐리 스마트'] $Phonebook.'존 도' $Phonebook.항목('J. 랜덤 해커')
다음과 같이 연관 배열을 반복할 수 있다.
$Phonebook.열쇠들. 앞을 내다 { "{0}: {1}" -f $_,$Phonebook.$_ }
다음을 사용하여 항목을 제거할 수 있음Remove()
기초의 방법NET 개체:
$Phonebook.제거하다('샐리 스마트')
해시 테이블 추가 가능:
$1201 = @{ a=1; b=2 } 2달러 2센트 = @{ c=3; d=4 } $2303 = $1201 + 2달러 2센트
데이터 직렬화 형식 지원
![]() |
많은 데이터 직렬화 형식도 연관 배열 지원(이 표 참조)
제이슨
JSON에서 연관 배열은 객체라고도 한다.키는 문자열만 사용할 수 있다.
{ "샐리 스마트": "555-9999", "존 도": "555-1212", "J. 랜덤 해커": "555-1337" }
YAML
YAML 연관 배열은 지도 요소 또는 키 값 쌍이라고도 한다.YAML은 키의 종류에 제한을 두지 않으며, 특히 스칼라 또는 문자열 값으로 제한되지 않는다.
샐리 스마트: 555-9999 존 도: 555-1212 J. 랜덤 해커: 555-1337
참조
- ^ 여기에 보관하고 소스 코드를 여기에 보관하십시오.POSIX 1003.1-2001은 기능을 설명한다.
hcreate()
,hdestroy()
그리고hsearch()
- ^ "uthash: a hash table for C structures". Github. Retrieved 3 August 2020.
- ^ "Hash Tables". Gnome Developer. Retrieved 3 August 2020.
- ^ "Associative Arrays - D Programming Language". dlang.org. Retrieved 2021-05-07.
- ^ "Erlang -- maps". erlang.org. Retrieved 2021-03-07.
- ^ "Common Lisp the Language, 2nd Edition: 15.6. Association Lists". Carnegie Mellon University. Retrieved 3 August 2020.
- ^ "Association (<-...->)—Wolfram Language Documentation". reference.wolfram.com.
- ^ "Key—Wolfram Language Documentation". reference.wolfram.com.
- ^ "Keys—Wolfram Language Documentation". reference.wolfram.com.
- ^ "Values—Wolfram Language Documentation". reference.wolfram.com.
- ^ "NSFastEnumeration Protocol Reference". Mac Developer Library. 2011. Archived from the original on 13 March 2016. Retrieved 3 August 2020.
- ^ "Module PMap". Ocaml-extlib. 2008. Archived from the original on 11 December 2008. Retrieved 3 August 2020.
- ^ PHP에서 어레이 구현 정보
- ^ "Arrays". PHP.net. Retrieved 3 August 2020.
- ^ "The SplObjectStorage class". PHP.net. Retrieved 3 August 2020.
- ^ "독점: 명명된 인수가 있는 구조"
- ^ "Map! datatype". doc.red-lang.org.