Có cấu trúc dữ liệu cho loại danh sách / bản đồ này không?


22

Có lẽ có một cái tên cho những gì tôi muốn, nhưng tôi không biết về nó. Tôi cần một cái gì đó tương tự như LinkedHashMaptrong Java, nhưng nơi nó trả về giá trị 'trước đó' nếu không có giá trị nào ở khóa được chỉ định.

Đó là, tôi có một danh sách các đối tượng được lưu trữ bởi một khóa số nguyên (tính theo đơn vị thời gian trong trường hợp của tôi):

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

Vì vậy, nếu tôi truy vấn giá trị cho khóa 0-9, nó sẽ trả về null. Phần đặc biệt là nếu tôi truy vấn thứ gì đó 10 <= i <= 14 thì nó sẽ trả về A. Hoặc, với i> = 20, nó sẽ trả về C.

Có một cấu trúc dữ liệu cho việc này?


Tôi không biết nếu có một triển khai nhưng bạn có thể mở rộng cái hiện có để làm điều này. Cho dù đó sẽ đạt được mục tiêu hiệu suất của bạn hay không mà không cần viết lại tôi không biết ...
Rig

1
+1 cho câu hỏi tuyệt vời. Hầu hết những người có ba đại diện chữ số thấp đều hỏi loại câu hỏi "làm ơn làm bài tập về nhà của tôi". Không phải trường hợp ở đây.
Tulains Córdova

Câu trả lời:


33

Bạn đang tìm kiếm một NavigableMap . Đây là một kiểu con của SortedMap cũng có một số chức năng có sẵn bên cạnh bản chất của bản đồ được sắp xếp. Lưu ý rằng bản đồ có thể điều hướng "được dùng để thay thế giao diện SortedMap." ( Cải tiến khung công tác bộ sưu tập Java SE 6 ). Tất cả mọi thứ hiện đang thực SortedMaphiện NavigableMapvà điều này có khả năng vẫn còn đúng.

Cụ thể, phương thức floorKey(K key)"trả về khóa lớn nhất nhỏ hơn hoặc bằng khóa đã cho hoặc null nếu không có khóa đó.

Đây chỉ là một trong nhiều phương pháp cho phép bạn có được các khóa hoặc bản con cụ thể của bản đồ.

  • trần / sàn (mục nhập cao hơn / thấp hơn tham số)
  • truy cập các phím hoặc bản đồ theo thứ tự giảm dần
  • đầu / đuôi (các mục nhập nhỏ hơn / lớn hơn một khóa đã cho)
  • cao hơn / thấp hơn (khóa tiếp theo cao hơn hoặc thấp hơn tham số)
  • Subap (đưa ra hai khóa, trả lại bản đồ nằm giữa hai phím)

Java có hai triển khai của NavigableMap - TreeMapConcảnSkipListMap .

Nếu bạn nhìn vào ý tưởng / việc thực hiện danh sách bỏ qua, bạn sẽ thấy tại sao nó sẽ hoạt động thực sự tốt với cấu trúc như vậy và các truy vấn của nó.


1+ câu trả lời tuyệt vời. Không bao giờ nghĩ rằng một Bản đồ cụ thể như vậy tồn tại trong API Java.
Tulains Córdova

@ user61852 Kiểu dữ liệu yêu thích của tôi là danh sách bỏ qua và tôi chọc vào nó. Khi tôi thấy nó được triển khai trong 1.6, tôi đã xem xét tất cả những gì nó cung cấp và nhận thấy các giao diện mà nó có và do đó tôi quen với nó.

Đó là loại điều thuyết phục tôi Java là một trong những ngôn ngữ được thiết kế tốt nhất mà bạn có thể tìm thấy.
Tulains Córdova

1
Lưu ý rằng mặc dù điều này dường như giải quyết vấn đề của OP, nhưng nó không hoạt động như những LinkedHashMapgì anh ấy đề cập. Không TreeMapphải cũng không ConcurrentSkipListMapđược sắp xếp theo thời gian chèn như thế LinkedHashMap, thay vào đó chúng được sắp xếp theo thứ Comparatortự tự nhiên của khóa hoặc nếu chúng thực hiện Comparable.
MikeFHay

1
Điểm rất tốt. Các hoạt động sàn là những gì tôi đang tìm kiếm, so sánh tôi có thể dễ dàng thêm. Và trong trường hợp của tôi, nó hoạt động tốt hơn nhiều để thực hiện bộ so sánh thay vì phát minh lại bánh xe. Cảm ơn.
Nick

1

Những gì bạn đang tìm kiếm là một bảng biểu tượng hỗ trợ các hoạt động được ra lệnh. Và trong trường hợp của bạn đó là hoạt động sàn.

Việc thực hiện băm của một bảng biểu tượng là nhanh nhất, nhưng nó không cung cấp các hoạt động được đặt hàng đó.

Nhưng cây thực hiện các bảng biểu tượng nào. Một ví dụ về điều đó trong Java là lớp TreeMap

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.