MAP هي مجموعة من أزواج القيمة الرئيسية ، والمعروفة أيضًا باسم القواميس أو المصفوفات الترابطية ، وما إلى ذلك ، وهي واحدة من أكثر هياكل البيانات شيوعًا. كيفية فرز الخريطة حسب القيمة في جافا؟ يبدو الأمر بسيطًا ، لكن ليس من السهل!
على سبيل المثال ، في الخريطة ، يكون المفتاح هو نوع السلسلة ، والذي يمثل كلمة ، والقيمة هي نوع int ، والذي يمثل عدد مرات ظهور الكلمة. الآن نريد الفرز بعدد المرات التي تظهر فيها الكلمة:
MAP MAP = جديد treemap () ؛ map.put ("Me" ، 1000) ؛ map.put ("و" ، 4000) ؛ map.put ("you" ، 3000) ؛ map.put ("food" ، 10000) ؛ map.put ( يجب أن تكون نتيجة الفرز حسب القيمة:
key Valueme 1000you 3000 و 4000Hungry 5000Later 6000Food 10000
بادئ ذي بدء ، لا يمكننا تبني بنية sortedMap ، لأن SortedMap عبارة عن خريطة يتم فرزها بواسطة المفاتيح ، وليس خريطة يتم فرزها حسب القيمة. ما نريده هو خريطة مرتبة حسب القيمة.
ألا يمكنك القيام بذلك باستخدام sortedMap؟
لا ، لأن الخريطة يتم فرزها بواسطة مفاتيحها.
الطريقة 1:
رمز Java التالي:
استيراد java.util.iterator ؛ استيراد java.util.set ؛ استيراد java.util.treeset ؛ الفئة العامة الرئيسية {public static void main (string [] args) {set set = new Treeset () ؛ set.add (زوج جديد ("Me" ، "1000")) ؛ set.add (زوج جديد ("و" ، "4000")) ؛ set.add (زوج جديد ("you" ، "3000")) ؛ set.add (زوج جديد ("Food" ، "10000")) ؛ set.add (زوج جديد ("جائع" ، "5000")) ؛ set.add (زوج جديد ("لاحقًا" ، "6000")) ؛ set.add (زوج جديد ("نفسي" ، "1000")) ؛ لـ (iterator i = set.iterator () ؛ i.hasnext () ؛) system.out.println ( }} زوج الفئة ينفذ اسم {Private Final String Name ؛ رقم int النهائي الخاص ؛ الزوج العام (اسم السلسلة ، رقم int) {this.name = name ؛ this.number = number ؛ } الزوج العام (اسم السلسلة ، رقم السلسلة) يرمي numberFormatexception {this.name = name ؛ this.number = integer.parseint (number) ؛ } public int compareto (object o) {if (o eastyof pair) {int cmp = double.compare (number ، ((pair) o) .number) ؛ if (cmp! = 0) {return cmp ؛ } return name.compareto (((pair) o) .Name) ؛ } رمي classcastException جديد ("لا يمكن مقارنة الزوج بـ" + o.getClass (). getName ()) ؛ } السلسلة العامة tostring () {return name + '' + number ؛ }} رمز C ++ مماثل:
typedef pair <string ، int> pair ؛ int cmp (const pair & x ، const pair & y) {return x.second> y.second ؛} map <string ، int> m ؛ vect curr-> الثاني)) ؛} الفرز (vec.begin () ، vec.end () ، cmp) ؛ الأهمية الأساسية للطريقة المذكورة أعلاه هي: تغليف زوج القيمة المفتاح (map.entry) في بنية الخريطة في فئة مخصصة (struct) ، أو استخدم فئة الخريطة. تعرف الفئات المخصصة كيفية فرز أنفسهم ، أي فرز القيمة ، على وجه التحديد ، تنفيذ الواجهة المماثلة أو إنشاء كائن المقارنة لأنفسهم ، ثم استخدم مجموعة مرتبة دون استخدام بنية الخريطة (SortedSet ، Treeset هي تطبيق من SortedSet) ، والذي يدرك الغرض من الفرز حسب القيمة في الخريطة. وهذا يعني ، بدلاً من استخدام MAP ، تعتبر الخريطة. تعتبر الخريطة ككائن ، بحيث تصبح المشكلة لتنفيذ مجموعة مرتبة من الكائن أو فرز مجموعة الكائن. يمكنك استخدام sortedSet ، بحيث يتم طلب قائمة أو صفيف ، ثم استخدامه بعد الإدراج ، أو استخدامه ، ثم فرزه (collections.sort () أو المصفوفات.
تغليف المعلومات في فئتها الخاصة. إما تنفيذ
قابلة للمقارنة وكتابة قواعد للترتيب الطبيعي أو كتابة أ
المقارنة بناء على معاييرك. تخزين المعلومات في فرز
جمع ، أو استخدم طريقة collections.sort ().
الطريقة 2:
يمكنك أيضًا استخدام الكود التالي لفرز القيمة:
خريطة ثابتة sortbyvalue (خريطة الخريطة) {list = new LinkedList (map.entryset ()) ؛ collections.sort (list ، new Comparator () {public int compare (object o1 ، object o2) {return ((((map.entry) (o1)). getValue ()) .Compareto (((map.entry) (o2)). نتيجة الخريطة = New LinkedHashMap () ؛ لـ (iterator it = list.iterator () ؛ it.hasnext () ؛) {map.entry entry = (map.entry) it.next () ؛ result.put (intpl.getKey () ، intrad.getValue ()) ؛ } نتيجة الإرجاع ؛ } خريطة ثابتة عامة sortbyvalue (خريطة الخريطة ، عكس منطقي النهائي) {list = new linkedList (map.entryset ()) ؛ collections.sort (قائمة ، مقارن جديد () {public int int (الكائن O1 ، الكائن O2) {if (عكسي) {return -((قابلة للمقارنة) ((map.entry) (o1)). getValue ()) .Compareto (((map.entry) (o2)). getValue () ؛ .Compareto (((map.entry) (O2)). getValue ()) ؛ نتيجة الخريطة = New LinkedHashMap () ؛ لـ (iterator it = list.iterator () ؛ it.hasnext () ؛) {map.entry entry = (map.entry) it.next () ؛ result.put (intpl.getKey () ، intrad.getValue ()) ؛ } نتيجة الإرجاع ؛ } خريطة الخريطة = new hashmap () ؛ map.put ("A" ، 4) ؛ map.put ("B" ، 1) ؛ map.put ("C" ، 3) ؛ map.put ("D" ، 2) ؛ خريطة الفرز = sortByValue (MAP) ؛ System.out.println (المصنفة) ؛ // الإخراج: {b = 1 ، d = 2 ، c = 3 ، a = 4} أو يمكن القيام به مثل هذا: خريطة الخريطة = new hashmap () ؛ map.put ("A" ، 4) ؛ map.put ("B" ، 1) ؛ map.put ("C" ، 3) ؛ map.put ("D" ، 2) ؛ تعيين <map.entry <string ، integer >> treeset = new Treeset <map.entry <string ، integer >> (New Cookerator <map.entry <string ، integer >> () {public int integer (map.entry <string ، integer> o1 ، map.entry <string ، integer> {integer d1 = o1.get. O2.GetValue () ؛ treeset.addall (map.entryset ()) ؛ System.out.println (Treeset) ؛ // الإخراج: [a = 4 ، c = 3 ، d = 2 ، b = 1] بالإضافة إلى ذلك ، فإن تنفيذ خريطة الفرز حسب القيمة في Groovy هو بالطبع الجوهر هو نفسه ، لكنه بسيط للغاية:
استخدم طريقة الفرز للخريطة في مروعة (يتطلب Groovy 1.6).
def stree = 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]
مماثل في بيثون:
h = {"a": 2 ، "b": 1 ، "c": 3} i = h.items () // i = [('a' ، 2) ، ('c' ، 3) ، ('b' ، 1)] ("ب" ، 1)]تتحدث المقالة أعلاه لفترة وجيزة عن فرز خريطة Java حسب القيمة هو كل المحتوى الذي أشاركه معك. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.