2009-10-15 5 views
0

정렬 된 개체 컬렉션에 대한 인터페이스를 쓰고 있습니다. 늘 그렇듯이, 나는 사용자들에게 맡겨서이 아이템들이 어떻게 정렬되는지를 지정한다. 나는 현재 키 - 값 인터페이스 (정렬 키가 값과 명시 적으로 분리되어 있음) 또는 값 전용 인터페이스 (값이 정렬 키이거나 사용자가 별도의 정렬을 처리해야하는 위치) 비교 함수를 전달하여 키).정렬 된 값을 키 값으로 추상화

필자가보기에 키 - 값 인터페이스는 사용자가 자연스럽게 자체 키를 구성하는 경우에도 항상 값에서 분리 된 키를 갖도록합니다. 그러나 사용자가 키를 처리해야하는 책임은 없으므로 API를 사용할 때 더 간단하고 명확한 사용자 코드가 될 수 있습니다. 값 전용 인터페이스를 사용하면 자체 키인 값을 더 간결하게 표현할 수 있지만 자연스러운 키 - 값 구별이있는 경우 사용자가 자신의 키를 추적하고 처리하도록합니다.

나이가 많은 문학은 가치있는 접근 방식을 선호하는 경향이 있지만, 새로운 문학은 키 - 값 접근 방식을 선호한다는 것은 나에게 (비록 틀릴 수도 있지만) 두 가지 접근법을 모두 지원하는 문헌이 있습니다.

이와 같은 경우 사용자의 기호에 대해 궁금합니다. 일반적으로 다른 사람보다 선호되는 시점에 도착 했습니까? 그렇지 않다면, 보통 무엇을 사용하고, 왜 그런가요?

답변

1

당신은

  • 사전 (일명 해시 테이블도 해시) (... 기본적으로 다양한 특징을 가진 다양한 언어로하지만)라고 무엇을 사이에 찢어진 것 같다
  • List입니다/배열

이러한 두 가지 유형의 컨테이너는 서로 다른 용도로 사용되지만, 몇 가지 비틀기와 함께 사전에서는 할 수없는 작은 목록이 있습니다. 사전에 더 많은 정보가 있기 때문입니다.

일반적으로은보다 명시적인 것이 더 입니다.
"2 dollars blue crayon" (목록)을 건네 주면 다음 속성을 가진 개체라고 추측 할 수 있습니다 : {Price = 2$, Color = blue, Type = Crayon} (사전). 그러나 이러한 파싱 (필요한 경우)은 도메인의 노력과 지식 또는 데이터의 암시 적 구조를 필요로합니다. 사전 접근 방식을 통해 일반적인 방식으로 정보를 처리 할 수 ​​있습니다.

목록이 "더 나은"경우가 있지만 목록 접근의 본질적인 특성보다는 기술적/운영 적 고려 사항에 묶이는 경우가 있습니다.예를 들어 간단한 전체 텍스트 엔진으로 검색 색인을 구현하는 경우 모든 속성을 함께 정리해야 할 수 있습니다 (이는 레이블이 지정되지 않은 키워드에 최종 사용자가 입력하는 방식을 반영하므로 모든 속성에서 찾을 수 있음).

  • 사용/두 목록의 행동과 사전
  • 최적화 된 (크기 현명한 및/또는 노출하는 API를 :

    질문에 대한 응답으로 실제 추천가 제공하는 것입니다 적어도 컨테이너가 사전으로 사용될 때까지는 성능면에서 List의 접근 방식 인 "가장자리"를 보존하는 구현이 중요합니다.

사전 분명 문제에 관한 성능이 의하지 않는 한 (예 : 컨테이너 수만 항목의 수천을 받게됩니다 컨테이너 인스턴스의 수천 느린 채널 등을 통해 전송,이 것, 컨테이너 것), 나는 을 것 API에 우선, 예를 들어 사전을 기반으로 구현과 함께 쉽게 할 수 있습니다. 나중에 필요할 때 구현이 수정 될 수 있습니다 (예 : 두 목록 및지도 스키마 사용).

마지막으로 한가지 : 다형성 용기 이런 종류의를 제공하는 라이브러리 (또는 언어 내장 매크로)의 많음이있다 : 어쩌면 하나의 대상 시스템/언어에 사용할 수 있는지가 ...

+0

문제를 파악했지만 키 - 값 (사전)보다 값 - 값 (목록) 구조를 추천하는 경우 몇 가지 추론을 제공하십시오. – sooniln

+0

저는 사전 목록을 (거의) 특별한 경우로 보았습니다 (적어도 정렬 된 모음에 대해 이야기하는 동안). 사전에 사용자가 선택할 수있는 방식으로 사용자가 처리 할 수 ​​있도록 정렬 키를 추상화하여 나열하고, 사전에는 값 목록에 명시 적 정렬 키가 첨부되어 있습니다. 이것은 목록을보다 일반적인 것으로 만들지 만 항상 효율적이지는 않습니다. – sooniln

+0

자세한 답변을 보내 주셔서 감사합니다. 가치있는 구현으로 기대고 있었지만, 내 자신에 대한 더 많은 연구와 결합 된 귀하의 의견은 저를 핵심 가치 접근 방식으로 밀어 붙였습니다. 결국, 개념적으로 Set은 Map보다 더 높은 추상화가 될 수 있지만 Map에서 Set을 구현할 수는 있지만 그 반대는 아닙니다. 이것은 내가 필요로하는 것보다 내게 더 많은 연습이지만, 불행하게도 현재 컨테이너에서 사용되는 언어에 대한 심각한 디자인 결함이 있습니다./ – sooniln

0

글쎄,이 귀하의 요구 사항을 대답하는 것 같습니다. keysector가 지정되어 있지 않으면 컬렉션은 항목 자체에 순서가 정의되어 있다고 가정합니다. IComparable을 구현해야합니다. 그렇지 않으면 이론적으로 여러 가지 방법으로 비교할 수있는 항목이있는 경우 자체 IComaprable 인 항목의 투영을 반환하는 키 선택기를 지정할 수 있습니다. 당신은 이름과 나이를 가진 Person 클래스가 있고, 나이까지 정렬 된 목록을 유지하고자하는 경우

예를 들어, 다음과 같은 방법으로 컬렉션을 만들 :

새로운 OrderedCollection을 (사람 => 인물);

BTW는 .Net과 함께 제공되는 SortedDictionary 및 SortedList 컬렉션을 확인합니다. 그들은 편리하게 올 수 있습니다.

+0

그 이유는 무엇입니까? – sooniln

0

그냥 키 + 값에 대한 래퍼 구조체 또는 객체를 만드는 경우 사전에서 수행 할 수있는 모든 작업에 대해 목록에서 값을 비워두면됩니다. 사전이 실제로 할 수없는 유일한 방법은 특정 형식의 값을 추가 한 다음 해당 형식을 반환하는 열거자를 사용하여 GetEnumerator 요청에 직접 응답하는 것입니다. 그러나이를 수행하기 위해 사전 주위에 래퍼 클래스를 작성하는 것은 쉽습니다.

그러나 사전과 목록의 주요 차이점은 키 부분은 동일하지만 값 부분은없는 레코드를 처리하는 방식입니다. Dictionary 메소드를 사용하는 방식에 대한 열렬한 팬이 아니지만 (add 메소드가 fail-if-exists 의미를 사용하는 반면, 기본 인덱스 속성은 '대체'의미론을 사용하고, 내 환경 설정은 "add"에 대한 모드 매개 변수를 가졌을 것입니다. "), 특정 키와 관련된 값을 변경할 수 있습니다. "목록"은 이전 값을 제거하고 새 값을 추가함으로써 의미 론적 문제를 일으킬 수있는 작업 만 시도하려고 시도 할 수 있습니다.

관련 문제