Tôi có một tập hợp các cặp tiền tố/giá trị và muốn tìm bất kỳ giá trị nào trong kết nối này được liên kết với tiền tố mà chuỗi đích hiện tại của tôi bắt đầu. (Nó không quan trọng là hành vi được định nghĩa trong trường hợp có nhiều hơn một tiền tố khớp với nhau, vì bản chất của ca sử dụng của tôi là như vậy mà điều này sẽ không bao giờ xảy ra).clojure: Xác định hiệu quả nếu một chuỗi bắt đầu với bất kỳ tiền tố nào trong bộ sưu tập
Một ngây thơ (làm việc) thực hiện sau:
(defn prefix-match [target-str pairs]
(some
(fn [[k v]]
(if (.startsWith target-str k)
v
false))
pairs))
như vậy mà:
user=> (prefix-match "foobar" {"meh" :qux, "foo" :baz})
:baz
này hoạt động như dự định, nhưng là O (n) với chiều dài của chuỗi pairs
. (Nhanh chóng chèn vào pairs
cũng là mong muốn, nhưng không quan trọng như tra cứu nhanh). Điều đầu tiên xuất hiện trong đầu là chia một bộ sưu tập được sắp xếp với truy cập ngẫu nhiên hiệu quả, nhưng tôi không chắc cấu trúc dữ liệu nào trong Clojure phù hợp nhất với nhiệm vụ. Gợi ý?
Mã ví dụ của bạn không hoạt động như được quảng cáo. Đó là tiền tố, mục tiêu-str hoặc khóa bản đồ? –
@JustinKramer Rất tiếc. Khóa bản đồ là tiền tố; cuộc gọi mẫu không chính xác. Đã sửa. (Hàm tiền tố khớp được đưa ra là những gì tôi đang thực sự sử dụng trong mã sản xuất). –