MAP เป็นชุดของคู่คีย์-ค่าหรือที่เรียกว่าพจนานุกรมหรืออาร์เรย์เชื่อมโยง ฯลฯ และเป็นหนึ่งในโครงสร้างข้อมูลที่พบบ่อยที่สุด จะเรียงลำดับแผนที่ตามค่าใน Java ได้อย่างไร? ดูเหมือนง่าย แต่ไม่ใช่เรื่องง่าย!
ตัวอย่างเช่นในแผนที่คีย์คือประเภทสตริงซึ่งแสดงถึงคำและค่าเป็นประเภท int ซึ่งแสดงจำนวนครั้งที่คำที่ปรากฏ ตอนนี้เราต้องการเรียงลำดับตามจำนวนครั้งที่คำที่ปรากฏ:
แผนที่ = ใหม่ treemap (); map.put ("me", 1000); map.put ("และ", 4000); map.put ("คุณ", 3000); map.put ("อาหาร", 10,000); map.put ("หิว", 5000); map.put ("ภายหลัง", 6000); ผลลัพธ์ของการเรียงลำดับตามค่าควรเป็น:
Key Valueme 1000you 3000 และ 4000 Hungry 5000later 6000food 10,000 10,000
ก่อนอื่นเราไม่สามารถใช้โครงสร้าง SortedMap ได้เนื่องจาก SortEdMap เป็นแผนที่ที่จัดเรียงตามคีย์ไม่ใช่แผนที่ที่จัดเรียงตามค่า สิ่งที่เราต้องการคือแผนที่ที่จัดเรียงตามค่า
คุณไม่สามารถทำสิ่งนี้กับ SortedMap ได้หรือไม่?
ไม่เพราะแผนที่ถูกจัดเรียงตามคีย์
วิธีที่ 1:
รหัส Java ต่อไปนี้:
นำเข้า java.util.iterator; นำเข้า java.util.set; นำเข้า java.util.treeset; คลาสสาธารณะหลัก {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {set set = new Treeset (); set.add (คู่ใหม่ ("me", "1,000")); set.add (คู่ใหม่ ("และ", "4000")); set.add (คู่ใหม่ ("คุณ", "3000")); set.add (คู่ใหม่ ("อาหาร", "10,000")); set.add (คู่ใหม่ ("หิว", "5000")); set.add (คู่ใหม่ ("ภายหลัง", "6000")); set.add (คู่ใหม่ ("ตัวเอง", "1,000")); สำหรับ (iterator i = set.iterator (); i.hasnext ();) system.out.println (i.next ()); }} คลาสจับคู่ใช้การเปรียบเทียบ {ชื่อสตริงสุดท้ายส่วนตัว; หมายเลข int สุดท้ายส่วนตัว; คู่สาธารณะ (ชื่อสตริงหมายเลข int) {this.name = name; this.number = number; } คู่สาธารณะ (ชื่อสตริง, หมายเลขสตริง) พ่น numberFormatexception {this.name = name; this.number = integer.parseint (หมายเลข); } public int compereto (Object O) {if (o อินสแตนซ์ของคู่) {int cmp = double.compare (จำนวน, ((คู่) o) .number); if (cmp! = 0) {return cmp; } return name.compareto (((คู่) o) .name); } โยน classcastexception ใหม่ ("ไม่สามารถเปรียบเทียบคู่กับ" + o.getClass (). getName ()); } public String toString () {return name + '' + number; - รหัส C ++ ที่คล้ายกัน:
Typedef pair <string, int> pair; int cmp (const pair & x, const pair & y) {return x.second> y.second;} แผนที่ <String, int> m; เวกเตอร์ <aa> vec; สำหรับ (แผนที่ <wstring, int> :: iterator curr = m.begin () curr-> second));} sort (vec.begin (), vec.end (), cmp); ความสำคัญที่สำคัญของวิธีการข้างต้นคือ: ห่อหุ้มคู่คีย์-ค่า (map.entry) ในโครงสร้างแผนที่ลงในคลาสที่กำหนดเอง (struct) หรือใช้ map.entry คลาสโดยตรง คลาสที่กำหนดเองรู้วิธีการเรียงลำดับตัวเองนั่นคือเรียงตามค่าใช้งานส่วนต่อประสานที่เปรียบเทียบได้โดยเฉพาะหรือสร้างวัตถุเปรียบเทียบสำหรับตัวเองจากนั้นใช้ชุดที่สั่งซื้อโดยไม่ต้องใช้โครงสร้างแผนที่ (SortedSet, Treeset เป็นการใช้งาน SortedSet) ซึ่งตระหนักถึงวัตถุประสงค์ของการเรียงลำดับตามค่าในแผนที่ กล่าวคือแทนที่จะใช้ MAP, MAP.INTRY ถือเป็นวัตถุเพื่อให้ปัญหากลายเป็นชุดที่สั่งซื้อของวัตถุหรือเรียงลำดับชุดของวัตถุ คุณสามารถใช้ SortedSet เพื่อให้หลังจากการแทรกเสร็จสมบูรณ์มันจะถูกสั่งซื้อตามธรรมชาติหรือใช้รายการหรืออาร์เรย์แล้วจัดเรียง (collections.sort () หรือ array.sort ())
ห่อหุ้มข้อมูลในชั้นเรียนของตัวเอง นำไปใช้อย่างใดอย่างหนึ่ง
เปรียบเทียบและเขียนกฎสำหรับการสั่งซื้อตามธรรมชาติหรือเขียนก
ตัวเปรียบเทียบตามเกณฑ์ของคุณ จัดเก็บข้อมูลในการจัดเรียง
การรวบรวมหรือใช้วิธีการรวบรวม ()
วิธีที่ 2:
นอกจากนี้คุณยังสามารถใช้รหัสต่อไปนี้เพื่อเรียงลำดับตามค่า:
แผนที่สาธารณะแบบคงที่ sortByValue (แผนที่) {รายการรายการ = ใหม่ linkedList (map.entryset ()); collections.sort (รายการ, ตัวเปรียบเทียบใหม่ () {public int compare (Object O1, Object O2) {return ((เปรียบเทียบ) ((map.entry) (O1)). getValue ()) .Compareto ((map.entry) (O2)). getValue ();}}); ผลลัพธ์แผนที่ = ใหม่ linkedHashMap (); สำหรับ (iterator it = list.iterator (); it.hasnext ();) {map.entry entry = (map.entry) it.next (); result.put (entry.getKey (), entry.getValue ()); } ผลตอบแทนผลลัพธ์; } แผนที่สาธารณะแบบคงที่ sortByValue (แผนที่, บูลีนสุดท้ายย้อนกลับ) {รายการรายการ = ใหม่ linkedList (map.entryset ()); collections.sort (รายการ, ตัวเปรียบเทียบใหม่ () {public int Compare (Object O1, Object O2) {ถ้า (ย้อนกลับ) {return -((เปรียบเทียบได้) ((map.entry) (O1)). getValue ()). compareto ((map.entry) (o2)) (O1)). getValue ()) .Compareto ((map.entry) (O2)). getValue ());}}); ผลลัพธ์แผนที่ = ใหม่ linkedHashMap (); สำหรับ (iterator it = list.iterator (); it.hasnext ();) {map.entry entry = (map.entry) it.next (); result.put (entry.getKey (), entry.getValue ()); } ผลตอบแทนผลลัพธ์; } แผนที่แผนที่ = ใหม่ hashmap (); map.put ("a", 4); map.put ("B", 1); map.put ("C", 3); map.put ("D", 2); MAP Sorted = sortByValue (แผนที่); System.out.println (เรียงลำดับ); // output: {b = 1, d = 2, c = 3, a = 4} หรือสามารถทำได้เช่นนี้: แผนที่ = ใหม่ hashmap (); map.put ("a", 4); map.put ("B", 1); map.put ("C", 3); map.put ("D", 2); ตั้งค่า <map.entry <String, Integer >> Treeet = ใหม่ treeet <map.entry <string, integer >> (ตัวเปรียบเทียบใหม่ <map.entry <String, Integer >> () {int สาธารณะเปรียบเทียบ (map.entry <String, integer> o1, map.entry <String, Integer> O2) O2.getValue (); TreeSet.addall (map.entryset ()); System.out.println (Treeset); // เอาต์พุต: [a = 4, c = 3, d = 2, b = 1] นอกจากนี้การใช้แผนที่เรียงลำดับตามค่าใน groovy แน่นอนว่าสาระสำคัญเหมือนกัน แต่มันง่ายมาก:
ใช้วิธีการเรียงลำดับของแผนที่ใน groovy (ต้องใช้ groovy 1.6)
def result = map.sort () {a, b -> b.value.compareto (a.value)} ชอบ:
["A": 3, "B": 1, "C": 4, "D": 2] .Sort {A, B -> A.Value - B.Value}
ผลลัพธ์คือ: [B: 1, D: 2, A: 3, C: 4]
คล้ายกันใน Python:
h = {"a": 2, "b": 1, "c": 3} i = h.items () // i = [('a', 2), ('c', 3), ('b', 1)] i.sort (lambda (k1, v1), (k2, v2): cmp (v2, v1) ('B', 1)]บทความข้างต้นพูดสั้น ๆ เกี่ยวกับการจัดเรียงแผนที่ Java ตามมูลค่าเป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น