Bagaimana Anda menggunakan diurutkan-peta-menurut untuk mengurutkan peta berdasarkan nilai?

Saya tidak dapat memahami dokumentasinya sama sekali.

Saya ingin peta yang diurutkan "xxx", yang mengurutkan peta berdasarkan nilainya. Bagaimana aku melakukan itu?

Terima kasih.


person unj2    schedule 06.10.2009    source sumber
comment
Seperti yang dijelaskan oleh @sepp2k, hal ini umumnya tidak mungkin dilakukan dengan peta terurut inti Clojure – urutannya didasarkan pada urutan pengurutan kunci. Lihat clojure.data.priority-map untuk melihat abstraksi yang mendukung hal ini.   -  person glts    schedule 24.06.2019


Jawaban (2)


Cara lain adalah dengan membandingkan nilai dari peta asli dalam fungsi pembanding.

(def my-map {:chad 3 :bob 5 :sammy 4})

;; sort by keys ascending
(into (sorted-map) my-map)
=> {:bob 5, :chad 3, :sammy 4}

;; sort by values ascending
(into (sorted-map-by (fn [key1 key2] (compare (key1 my-map) (key2 my-map)))) my-map)
=> {:chad 3, :sammy 4,  :bob 5}

;; sort by values descending
(into (sorted-map-by (fn [key1 key2] (compare (key2 my-map) (key1 my-map)))) my-map)
=> {:bob 5, :sammy 4, :chad 3}
person Chad Braun-Duin    schedule 15.07.2010
comment
Hati-hati, ada bug dalam solusi Anda, periksa ini: (def my-map {:chad 3 :bob 5 :alice 3 :sammy 4}) Dengan solusi Anda, :alice 3 akan terpotong dari peta yang dihasilkan. - person Alfredo Di Napoli; 28.03.2011
comment
@AlfredoDiNapoli Saya melihat masalah yang sama. Saya dapat memperbaikinya, menggunakan ‹= alih-alih membandingkan dalam fungsi anonim. - person Rafael; 09.10.2011
comment
Bukankah @Rafael punya ide untuk menggunakan <= alih-alih compare mengikat kode saya ke implementasi sorted-map-by? Clojure Docs mengacu pada kasus penggunaan sorted-map-by dan mengusulkan solusi berikut: (into (sorted-map-by (fn [key1 key2] (compare [(key1 my-map2) key1] [(key2 my-map2) key2]))) my-map2) sebagai gantinya - person mjaskowski; 18.04.2014

Anda menggunakan diurutkan-peta-menurut dengan menentukan perbandingan diikuti dengan pasangan nilai kunci. Komparator adalah fungsi yang mengambil dua kunci dan mengembalikan -1, 0, atau 1 bergantung pada apakah kunci pertama lebih kecil, sama dengan, atau lebih besar dari kunci kedua.

Contoh:

user=> (sorted-map-by (fn [k1 k2] (compare (mod k1 10) (mod k2 10))) 10 1 23 4 2 5)
{10 1, 2 5, 23 4}

Karena fungsi perbandingan hanya menggunakan kunci sebagai argumen, Anda tidak dapat menggunakan ini untuk mengurutkan berdasarkan nilai.

Tidak ada cara untuk mengurutkan peta yang petanya diurutkan berdasarkan nilainya. Jika ya, entri berdasarkan kunci tidak akan dapat ditemukan karena Anda tidak dapat menggunakan pesanan untuk menentukan di mana entri tersebut berada (karena pesanan tidak bergantung pada kunci).

person sepp2k    schedule 06.10.2009
comment
Di halaman dokumen saya pikir Anda dapat membaca arti sebaliknya Jika Anda ingin mengurutkan peta berdasarkan nilainya,... clojuredocs.org/clojure_core/clojure.core/sorted-map-by - person tangrammer; 26.11.2013