أنواع الخريطة
في Java ، تتمثل الوظيفة الرئيسية للخريطة في تخزين أزواج القيمة الرئيسية. نظرًا لأنه يتم الحصول على القيمة بناءً على المفتاح ، لا يُسمح بتكرار المفتاح. لديها بشكل أساسي الفئات التالية:
هاشماب:
تخزن الخريطة الأكثر شيوعًا البيانات وفقًا لقيمة Hashcode للمفتاح ، ويمكنها الحصول مباشرة على قيمتها وفقًا للمفتاح ، مع سرعة وصول سريعة جدًا. عند العبور ، يكون ترتيب الحصول على البيانات عشوائيًا تمامًا. HashMap يسمح بسجل واحد فقط ليكون فارغًا ؛ قيمة السجلات المتعددة لتكون فارغة. لا يدعم HashMap مزامنة مؤشرات الترابط ، أي أن عدة مؤشرات ترابط يمكنها كتابة HashMap في أي وقت ؛ قد يؤدي إلى عدم الاتساق في البيانات. إذا كان المزامنة مطلوبة ، فيمكنك استخدام طريقة SynchronizedMap للمجموعات لجعل hashmap متزامنة ، أو استخدام concurrenthashmap. Hashtable مشابه للهاشماب. يرث من فئة القاموس. الفرق هو أنه لا يسمح أن تكون المفاتيح أو القيم المسجلة فارغة ؛ إنه يدعم مزامنة الخيط ، أي أن موضوع واحد فقط يمكنه كتابة علامة التصنيف في أي وقت ، لذلك فهو يسبب أيضًا أن يكون علامة التجزئة أبطأ عند الكتابة.
LinkedHashMap
يتم حفظ ترتيب الإدراج للسجلات. عند اجتياز LinkedHashMap مع Iterator ، يجب إدراج السجلات التي تم الحصول عليها أولاً أولاً. يمكنك أيضًا استخدام المعلمات أثناء البناء وفرزها وفقًا لعدد التطبيقات. سيكون أبطأ من hashmap عند العبور ، ولكن هناك استثناء. عندما يكون لدى HashMap سعة كبيرة وبيانات أقل فعالية ، قد تكون أبطأ من LinkedHashMap ، لأن سرعة اجتياز LinkedHashMap ترتبط فقط بالبيانات الفعلية وليس لها أي علاقة بالقدرة ، في حين ترتبط سرعة التجوال في HashMap بقدرها.
تريماب
تنفيذ واجهة SortMap ، يمكن فرز السجلات التي يحفظها وفقًا للمفتاح. بشكل افتراضي ، يتم فرزه بترتيب تصاعدي لقيم المفاتيح ، أو يمكنه أيضًا تحديد مقارنة مصنفة. عندما يتم اجتيازها مع التكرار ، يتم فرز السجلات التي تم الحصول عليها.
الفرز الرئيسي
من المقدمة أعلاه إلى أنواع الخرائط ، يمكننا أن نرى أن Treemap لديها وظيفة فرز المفتاح الخاصة بها. يحتاج فقط إلى تنفيذ واجهة مقارنة في نفس الوقت عند إنشائها. المثال على النحو التالي:
private static void sort_by_key () {map <integer ، integer> treemap = new treemap <> (New Paratator <Integer> () {Override public int compare (integer o1 ، integer o2) {return o2-o1 ؛ // order order. // املأ البيانات لـ (int i = 0 ؛ i <100 ؛ i ++) {int key = (int) (10000*math.random ()) ؛ int value = (int) (10000*math.random ()) ؛ treemap.put (المفتاح ، القيمة) ؛ } outMap (treemap) ؛ ) }}/* والنتيجة هي كما يلي: المفتاح = 9977 القيمة = 80key = 9684 القيمة = 7108Key = 9422 القيمة = 1706Key = 9264 value = 1210Key = 9248 value = 6414key = 8814ke القيمة = 8171Key = 8728 value = 1538Key = 8513 value = 4956Key = 8462 value = 5617Key = 8355 value = 8912*/كما يتضح من ما سبق ، ليس من الصعب فرز المفاتيح ، ولكن من المثير للقلق أن تضع هذا النوع ، لذلك تحتاج إلى قلب الخريطة.
فرز حسب القيمة
نظرًا لأن MAP ليس لديها هذه الوظيفة في Java ، فنحن بحاجة إلى تنفيذها بأنفسنا. الفكرة هي كما يلي:
قائمة في Java يمكن استخدام واجهة المقارنة.
الخريطة هي في الواقع إدخال <> مجموعة. لذا ، يمكن أن يؤدي استخدام القائمة <الإدخال <>> إلى تنفيذ الفرز وإدخال العناصر المرتبة في LinkedMap.
تطبيق الكود كما يلي:
خريطة ثابتة خاصة <integer ، integer> sortmap (map <integer ، integer> linkedMap) {list <map.entry <integer ، integer >> cache = new ArrayList <> (linkedMap.EntrySet ()) ؛ // أعد كتابة مجموعة وظائف المقارنة. }) ؛ الخريطة <integer ، integer> resultMap = new LinkedHashMap <> () ؛ // أدخل النتيجة في linkedMap والعودة لـ (int i = 0 ؛ i <cache.size () ؛ i ++) {resultmap.put (cache.get (i) .getKey () ، cache.get (i) .getValue ()) ؛ } return resultmap ؛ }/*النتيجة: 7965 99661067 99631720 98333257 97383934 9578777 93481924 93153472 92703649 91145892 9078*وبهذه الطريقة ، يمكن تحقيق كل من الفرز حسب القيمة والفرز حسب المفتاح.