2011-08-29 39 views
7

Trong Java 1.6, giao diện NavigableMap (và NavigableSet) đã được giới thiệu và TreeMap được cập nhật để triển khai giao diện mới. Trong số những thứ khác, NavigableMap hữu ích khi đặt câu hỏi như "Yếu tố nào trong bộ sưu tập gần nhất với X? (Xem this excellent blog post by François Sarradin để biết ví dụ và thảo luận).Có phiên bản Scala của NavigableMap không?

Tôi đã hy vọng tìm được điều gì đó tương tự trong triển khai TreeMap của Scala 2.8 , nhưng than ôi, nó không xuất hiện như vậy (ít nhất, nó không phải là rõ ràng) Có một lớp Scala hoặc đặc điểm tương tự như NavigableMap của Java? Nếu không, có một số thành ngữ Scala đơn giản có thể được sử dụng để đạt được một cái gì đó tương tự?

tôi nhận ra tôi có thể sử dụng TreeMap Java, nhưng tôi muốn ở lại trong khuôn khổ bộ sưu tập Scala (nếu chỉ vì đơn giản).

Trả lời

2

Trên các bộ sưu tập không thay đổi, có tham chiếu ngược lại khiến không thể thực hiện việc thu thập liên tục. Vì vậy, thay vào đó, mọi người sử dụng zippers để điều hướng qua các cấu trúc như vậy. có một ví dụ điển hình về việc sử dụng các khóa kéo khi làm việc với XML.

+0

Nó khá rõ ràng như thế nào một dây kéo có thể giúp sửa đổi (sao chép) cây, nhưng nó ít rõ ràng như thế nào một dây kéo sẽ được sử dụng để trả lời câu hỏi như "Những yếu tố trong bộ sưu tập là gần nhất với X?". Tôi biết chúng tôi đang nói chủ yếu là lý thuyết ở đây (kể từ khi dây kéo dường như chủ yếu là thử nghiệm), nhưng bạn có thể mô tả làm thế nào một dây kéo có thể trả lời câu hỏi đã đề cập trước đó? –

+0

@Jim Zippers không phải là thử nghiệm. Dây kéo có hai loại hoạt động: kiểm tra/cập nhật và điều hướng. Vì vậy, nếu bạn có một dây kéo tại X, hoạt động điều hướng của nó sẽ tự nhiên cung cấp cho bạn các yếu tố gần nhất. –

+0

Ah tôi thấy bây giờ! Cảm ơn. Các câu hỏi bạn liên kết đến về khóa kéo là những gì đã cho tôi dây kéo ấn tượng đã được thử nghiệm. Vui mừng khi biết họ sẵn sàng. –

1

Here's a thread on this topic

Có vẻ như SortedMapcó thể có thể giúp bạn tham gia, nhưng những gì tôi đã thử nghiệm cho đến nay tôi không chắc liệu đó có phải là O (log (n)) không. là:

def searchMap(m: SortedMap[Int,_], k: Int) = { 
    val left = m to(k) lastKey 
    val right = m from(k) take(2) lastKey 

    if (k - left < right - k) 
     left 
    else 
     right 
} 

dựa trên các định nghĩa của fromto về rangeImpl nó trông như thế này có thể là O (log (n)), nhưng dựa trên thực tế thời gian đó, nó xuất hiện để phát triển tuyến tính cho tất cả các chính đáng giá trị của n.

Vì vậy, tôi không chắc chắn.

+0

Tại sao không, nhưng các chức năng đến và từ đang tạo hai bản đồ mới, có thể không được mong muốn. –

Các vấn đề liên quan