이 유형의 목록 / 맵에 대한 데이터 구조가 있습니까?


22

아마도 내가 원하는 것에 대한 이름이 있을지 모르지만 나는 그것을 모른다. LinkedHashMapJava 와 비슷한 것이 필요 하지만 지정된 키에 값이 없으면 '이전'값을 반환합니다.

즉, 정수 키 (내 경우에는 시간 단위)로 저장된 객체 목록이 있습니다.

; key->value
10->A
15->B
20->C

따라서 0-9 키의 값을 쿼리하면을 반환 null합니다. 특별한 부분은 내가 10 <= i <= 14를 쿼리하면 A를 반환하거나 i> = 20의 경우 C를 반환하는 것입니다.

이에 대한 데이터 구조가 있습니까?


구현 된 것이 있는지는 모르겠지만 기존의 것을 확장 하여이 작업을 수행 할 수 있습니다. 그것이 당신의 수행 목표를 달성 할 것인지, 다시 쓰지 않고서는 안될지 모르겠다 ...
Rig

1
좋은 질문에 +1. 세 자리 숫자의 담당자가있는 대부분의 사람들은 "제 숙제를하십시오"유형의 질문을합니다. 여기서는 그렇지 않습니다.
Tulains Córdova

답변:


33

당신은 NavigableMap을 찾고 있습니다. 이것은 SortedMap의 하위 유형이며 정렬되는 맵의 특성 외에 몇 가지 기능을 사용할 수 있습니다. 탐색 가능 맵은 "SortedMap 인터페이스를 대체하기위한 것입니다." ( Java SE 6 Collections Framework 향상 ). 현재 구현 SortedMap하고있는 모든 것이 구현 NavigableMap될 가능성이 높습니다.

특히, floorKey(K key)"가장 큰 키를 주어진 키보다 작거나 같은 방법 으로 반환하거나 그러한 키가없는 경우 null을 반환하는 방법입니다.

이것은 특정 키 또는 맵의 서브맵을 얻을 수있는 많은 방법 중 하나입니다.

  • 천장 / 바닥 (매개 변수보다 높거나 낮은 항목)
  • 내림차순으로 키 또는 맵 액세스
  • 머리 / 꼬리 (주어진 키보다 작거나 큰 항목)
  • 높음 / 낮음 (매개 변수보다 높거나 낮은 다음 키)
  • 서브맵 (두 키가 주어지면 두 키 사이에있는 맵을 리턴)

Java에는 NavigableMap의 두 가지 구현 ( TreeMapConcurrentSkipListMap)이 있습니다.

건너 뛰기 목록 의 아이디어 / 구현을 보면 왜 그러한 구조와 쿼리에서 제대로 작동하는지 알 수 있습니다.


1+ 큰 답변. 그러한 특정 맵이 Java API에 존재한다고 생각하지 마십시오.
Tulains Córdova

@ user61852 내가 좋아하는 데이터 유형은 건너 뛰기 목록이며 주변을 둘러 보았습니다. 1.6에서 구현 된 것을 보았을 때 제공 된 모든 것을 살펴보고 인터페이스가 무엇인지 알았으므로 익숙했습니다.

그것은 Java가 당신이 찾을 수있는 최고의 디자인 언어 중 하나라고 설득시키는 것들입니다.
Tulains Córdova

1
이것은 OP의 문제를 다루는 것처럼 보이지만 LinkedHashMap그가 언급 한 것과는 다르게 행동하지 않습니다 . 삽입 시간에 의해 정렬 TreeMap되거나 ConcurrentSkipListMap정렬 되지 않으며 LinkedHashMap, Comparator구현하는 경우 키 또는 자연 순서로 정렬됩니다 Comparable.
MikeFHay

1
아주 좋은 지적입니다. 바닥 작업은 내가 찾던 것입니다. 비교기를 쉽게 추가 할 수 있습니다. 그리고 제 경우에는 바퀴를 재발 명하는 대신 비교기를 구현하는 것이 훨씬 좋습니다. 감사.
Nick

1

찾고있는 것은 순서가 지정된 작업을 지원하는 기호 테이블입니다. 그리고 귀하의 경우 그것은 바닥 작업입니다.

기호 테이블의 해시 구현이 가장 빠르지 만 순서가 지정된 작업은 제공하지 않습니다.

그러나 심볼 테이블의 트리 구현은 그렇지 않습니다. Java의 예로는 TreeMap 클래스가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.