คุณใช้ sorted-map-by เพื่อจัดเรียงแผนที่ตามค่าอย่างไร

ฉันไม่เข้าใจเอกสารเลย

ฉันต้องการแผนที่ที่เรียงลำดับ "xxx" ซึ่งจะเรียงลำดับแผนที่ตามค่า ฉันจะทำอย่างไร?

ขอบคุณ.


person unj2    schedule 06.10.2009    source แหล่งที่มา
comment
ตามที่อธิบายโดย @sepp2k โดยทั่วไปสิ่งนี้ไม่สามารถทำได้กับแมปที่จัดเรียงของ Clojure core - ลำดับของพวกมันจะขึ้นอยู่กับลำดับการจัดเรียง คีย์ ลองดู clojure.data.priority-map เพื่อดูนามธรรมที่สนับสนุนสิ่งนี้   -  person glts    schedule 24.06.2019


คำตอบ (2)


อีกวิธีหนึ่งคือการเปรียบเทียบค่าจากแผนที่ต้นฉบับภายในฟังก์ชันเปรียบเทียบ

(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
ระวัง มีข้อบกพร่องในโซลูชันของคุณ ตรวจสอบสิ่งนี้: (def my-map {:chad 3 :bob 5 :alice 3 :sammy 4}) ด้วยวิธีแก้ปัญหาของคุณ :alice 3 จะถูกตัดออกจากแผนที่ผลลัพธ์ - person Alfredo Di Napoli; 28.03.2011
comment
@AlfredoDiNapoli ฉันสังเกตเห็นปัญหาเดียวกัน ฉันสามารถแก้ไขได้โดยใช้ ‹= แทนการเปรียบเทียบในฟังก์ชันที่ไม่ระบุตัวตน - person Rafael; 09.10.2011
comment
@Rafael ไม่ใช่ความคิดที่จะใช้ <= แทนที่จะ compare ผูกโค้ดของฉันกับการใช้งาน sorted-map-by ใช่หรือไม่ Clojure Docs อ้างถึงกรณีการใช้งานของ sorted-map-by และเสนอวิธีแก้ปัญหาดังกล่าว: (into (sorted-map-by (fn [key1 key2] (compare [(key1 my-map2) key1] [(key2 my-map2) key2]))) my-map2) แทน - person mjaskowski; 18.04.2014

คุณใช้ sorted-map-by โดยระบุการเปรียบเทียบตามด้วยคู่คีย์-ค่า ตัวเปรียบเทียบเป็นฟังก์ชันที่รับสองคีย์และส่งกลับ -1, 0 หรือ 1 ขึ้นอยู่กับว่าคีย์แรกมีขนาดเล็กกว่า เท่ากับ หรือมากกว่าคีย์ที่สอง

ตัวอย่าง:

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}

เนื่องจากฟังก์ชันการเปรียบเทียบจะใช้เฉพาะคีย์เป็นอาร์กิวเมนต์ คุณจึงใช้ฟังก์ชันนี้เพื่อจัดเรียงตามค่าไม่ได้

ไม่มีวิธีใดที่จะมีแผนที่ที่เรียงลำดับโดยที่แผนที่จะถูกจัดเรียงตามค่า หากเป็นเช่นนั้น คุณจะไม่สามารถค้นหารายการด้วยคีย์ได้ เนื่องจากคุณไม่สามารถใช้ลำดับเพื่อกำหนดตำแหน่งของรายการได้ (เนื่องจากลำดับจะไม่ขึ้นอยู่กับคีย์)

person sepp2k    schedule 06.10.2009
comment
ในหน้าเอกสาร ฉันคิดว่าคุณสามารถอ่านความหมายการสนทนาได้ หากคุณต้องการจัดเรียงแผนที่ตามค่า... clojuredocs.org/clojure_core/clojure.core/sorted-map-by - person tangrammer; 26.11.2013