জাভা অর্ডার মানচিত্র


322

জাভাতে, কী এমন কোনও বস্তু রয়েছে যা কী / মান জোড়গুলি সংরক্ষণ ও অ্যাক্সেসের জন্য মানচিত্রের মতো কাজ করে, তবে কী এবং মান তালিকাগুলি একই ক্রমে থাকা কীগুলির একটি আদেশযুক্ত তালিকা এবং মানগুলির একটি আদেশযুক্ত তালিকা ফিরে পেতে পারে?

সুতরাং কোড দ্বারা ব্যাখ্যা হিসাবে, আমি এমন কিছু সন্ধান করছি যা আমার কল্পিত অর্ডারম্যাপের মতো আচরণ করে:

OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");

String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();

for(int i = 0; i < keys.size(); i++)
{
    Integer key = keys.get(i);
    String value = values.get(i);
    Assert(om.get(key) == value);
}

4
আপনি যা করতে চাইছেন তা যদি একই সাথে উভয়ের মধ্যে পুনরাবৃত্তি হয়, তবে মানচিত্র.এন্ট্রিসেট () আপনাকে কোনও মানচিত্রে এটি করতে দেয়। লিংকডহ্যাশম্যাপের একটি সুসংজ্ঞাযুক্ত অর্ডার রয়েছে তবে যে কোনও মানচিত্রের জন্য এন্ট্রি সেটটি কী / মান জোড়গুলি প্রতিফলিত করে।
পিট কির্খাম

5
এই কোডটি কোনও ভাল উদাহরণ নয় কারণ কোনও মানচিত্রের প্রয়োগটি আপনার নমুনা কোড হিসাবে আচরণ করবে। বাছাই, আদেশ বা না।
পিটার লরি

2
সান জেডিকে বাস্তবায়নে, মানচিত্রের getKeys এবং getValues ​​() সেট দ্বারা ফিরে আসা সেটগুলি এন্ট্রিসেট () মানচিত্রে সমর্থনযুক্ত, সুতরাং একই পুনরাবৃত্তির ক্রম থাকবে যা আপনার নমুনা পরীক্ষা করে।
পিট কির্খাম

4
ওয়েল এটি আকর্ষণীয়, আমি এটি কখনই লক্ষ্য করিনি। তবুও, আমাকে পাগল বলুন, তবে আমি বাস্তবায়ন সম্পর্কে অনুমান করা পছন্দ করি না যা স্পষ্টভাবে ইন্টারফেস দ্বারা যাচাই করা হয় না। অতীতেও আমি অনেকবার জ্বলে উঠেছি।
হোয়াটস

2
আদেশ দেওয়া মানচিত্রটি আলাদা কিছু হওয়ায় এটি জাভা সাজানো মানচিত্রের নামকরণ করা উচিত - দেখুন LinkedHashMap
ওন্দ্র ŽiŽka

উত্তর:


397

SortedMap ইন্টারফেস (বাস্তবায়ন TreeMap ) আপনার বন্ধু হতে হবে।

ইন্টারফেসের পদ্ধতি রয়েছে:

  • keySet() যা আরোহণের ক্রমে কীগুলির একটি সেট প্রদান করে
  • values() যা সংশ্লিষ্ট কীগুলির আরোহী ক্রমে সমস্ত মানের সংগ্রহ প্রদান করে

সুতরাং এই ইন্টারফেস ঠিক আপনার প্রয়োজনীয়তা পূরণ করে। তবে কীগুলির অবশ্যই একটি অর্থপূর্ণ ক্রম থাকতে হবে। অন্যথায় আপনি লিংকডহ্যাশম্যাপটি ব্যবহার করতে পারেন যেখানে সন্নিবেশনের আদেশ দ্বারা আদেশটি নির্ধারিত হয়।


2
উদাহরণ: সাজানো মানচিত্র <স্ট্রিং, অবজেক্ট> মানচিত্র = নতুন ট্রিম্যাপ <> ();
বেন

7
ট্রি ম্যাপ ব্যবহার করার জন্য মূল শ্রেণীর তুলনামূলক ইন্টারফেস প্রয়োগ করতে হবে। যদি তা না হয় তবে একরকম রানটাইম এক্সেপশন নিক্ষেপ করা হবে। ট্রি ম্যাপ এটির মানচিত্রও বাছাই করা হয়েছে তবে আমি মনে করি লেখক কেবল আদেশযুক্ত (সাজানো নয়) মানচিত্রটি ব্যবহার করতে চান। লিংকডহ্যাশম্যাপটি কেবল অর্ডার করা মানচিত্রটি পাওয়া ভাল পছন্দ (যেমন আপনি বলেছেন, "সন্নিবেশনের আদেশ দ্বারা নির্ধারিত")।
কে গোল গোল

1
কীসেট ()

4
থেকে জাভা 8 ডকLinkedHashMapযার পুনরাবৃত্তির ক্রম হল তার
প্রবেশাগুলি সর্বশেষে প্রবেশের ক্রম

1
@TRiNE আমি আপনার মন্তব্য অনুসরণ করি না, তবে আমি কিছু প্রসঙ্গ মিস করতে পারি। ডিফল্টরূপে LinkedHashMapএর পুনরাবৃত্তির অর্ডার সন্নিবেশ-অর্ডার, কিন্তু আপনি যদি এর পরিবর্তে এক্সেস-অর্ডার উল্লেখ করতে একটি ভিন্ন কন্সট্রাকটর ব্যবহার করতে পারেন। docs.oracle.com/javase/8/docs/api/java/util/…
লুঠ করুন

212

কী / মান জোড় জোড় সংরক্ষণ এবং অ্যাক্সেসের জন্য মানচিত্রের মতো কাজ করে এমন কী আছে, তবে কী এবং মান তালিকাগুলি একই ক্রমে রয়েছে এমন কীগুলির একটি আদেশযুক্ত তালিকা এবং মানগুলির একটি আদেশযুক্ত তালিকা ফিরে আসতে পারে?

আপনি java.util.LinkedHashMap খুঁজছেন । আপনি মানচিত্রের একটি তালিকা পাবেন E এনট্রি <কে, ভি> জোড়া, যা সর্বদা একই ক্রমে পুনরাবৃত্তি হয়। এই অর্ডারটি সেই আদেশের সমান যা আপনি আইটেমগুলিতে রেখেছেন ternative বিকল্পভাবে java.util.SortMap ব্যবহার করুন , যেখানে কীগুলি অবশ্যই প্রাকৃতিক ক্রমযুক্ত থাকতে হবে বা এটি দ্বারা নির্দিষ্ট করা উচিত Comparator


14
এবং এটি কেবল পাঠককে ডাবল চেক করতে বাঁচাতে, কারণ এটি পরীক্ষা করে যাচাই করা শক্ত, keySet()পদ্ধতিটি কার্যকরভাবে একটি লিঙ্কডহ্যাশসেট প্রদান করে যা আপনার put()কলগুলির ক্রমকে প্রতিফলিত করে । নোট করুন যে put()একই কীটির জন্য বার বার কল করার পরে আপনি কীটি না দিয়ে অর্ডার পরিবর্তন করবেন না remove()
গ্লেন লরেন্স

থেকে জাভা 8 ডকLinkedHashMapযার পুনরাবৃত্তির ক্রম হ'ল তার
প্রবেশাগুলি সর্বশেষে প্রবেশের ক্রম

24

লিঙ্কডহ্যাশম্যাপ কীগুলির ক্রম বজায় রাখে।

java.util.LinkedHashMap অন্যথায় অন্যভাবে হ্যাশম্যাপের মতো কাজ করে।


1
এটি প্রশ্নের উত্তর সরবরাহ করে না। কোনও লেখকের কাছ থেকে সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন - আপনি সর্বদা আপনার নিজের পোস্টে মন্তব্য করতে পারেন, এবং আপনার যথেষ্ট খ্যাতি অর্জনের পরে আপনি কোনও পোস্টে মন্তব্য করতে সক্ষম হবেন ।
ianaya89

2
@ ianaya89 আমি মনে করি এটি একটি আসল উত্তর তবে এটি জন ফেমেনিেলার জবাবের সাথে খুব মিল !
T30

1
যদি আপনি কোনও অর্ডারযুক্ত মানচিত্র পেতে চান তবে লিংকডহ্যাশম্যাপের চেয়ে লিংকড হ্যাশম্যাপের চেয়ে এন্ট্রিগুলিকে সেই মানচিত্রে সংরক্ষণ করা হয়। আপনি যদি নিজের মানচিত্রে এন্ট্রিগুলিকে স্বতন্ত্র ফর্ম হিসাবে সজ্জিত করতে চান তবে একটি সাজানো ম্যাপের চেয়ে সঠিক উত্তর।
রাল্ফ

@TRiNE জাভা 8 ডকটি আপনি লিঙ্ক করেছেন বলেছেন দুটি ক্রমক্ষম পদ্ধতি সম্ভব: সন্নিবেশ-ক্রম এবং অ্যাক্সেস-অর্ডার। আপনি পরেরটি সম্পর্কে ভাবেন যা একটি বিশেষ কনস্ট্রাক্টর পাবলিক লিংকডহ্যাশম্যাপ (ইন্ট ইরিশানাল ক্যাপাসিটি, ফ্লোট লোড ফ্যাক্টর, বুলিয়ান অ্যাক্সেসআর্ডার) ব্যবহারের দ্বারা আহ্বান করা হয়েছে about ডিফল্ট কনস্ট্রাক্টর একটি সন্নিবেশ-আদেশযুক্ত লিঙ্কডহ্যাশম্যাপ দৃষ্টান্ত তৈরি করে।
আর্তুর আইসিক

1
@ আরতুর্যাসিক হ্যাঁ এটি হ'ল। এটা বেশ কয়েকদিন আগে আমার দ্বারা করা একটি ভুল ছিল। আমি এটি সংশোধন করব। আমি মন্তব্য মুছে ফেলছি। যেহেতু আমি আর এটি সম্পাদনা করতে পারছি না
ট্রাই করুন

7

আমি মনে করি আপনি ফ্রেমওয়ার্ক থেকে নিকটতম সংগ্রহটি হ'ল সোর্টার্ড ম্যাপ


3
যদি আমি মনে করি এটির জন্য পয়েন্টগুলি হারাতে হবে তবে আমি এই উত্তরে ভোট দেব vote উপরের উত্তরের উল্লেখ হিসাবে, আপনার উত্তরে লিংকডহ্যাশম্যাপ সম্পর্কে যথাযথ তথ্যের অভাব রয়েছে এবং সোর্টার্ডম্যাপের একটি সামান্য ব্যাখ্যাও খুব সুন্দর হবে।
CorayThan

@ কোরেথান, সেক্ষেত্রে আপনি সেরা উত্তরগুলি সমর্থন করেছেন, অন্যকে যে সঠিক হতে পারে তবে সেরা নয় তবে সবচেয়ে ভাল নয় ...
ব্রুনো কনদে

1
এটাই আমি করেছি। শুধু বলার কারণে আমি বুঝতে পারি যে কেউ কেন এটির ভোট দেয়।
CorayThan

5

আপনি নেভিগিব্যাপেফ ইন্টারফেসটি উত্তোলন করতে পারেন যা অ্যাকসেসিং বা উত্থিত কী অর্ডারটিতে প্রবেশ করা এবং ট্র্যাভারসড হতে পারে। এই ইন্টারফেসটি सॉোর্টড ম্যাপ ইন্টারফেসকে ছাড়িয়ে যাওয়ার উদ্দেশ্যে । নেভিগিয়েবল মানচিত্রটি সাধারণত তার কীগুলির প্রাকৃতিক ক্রম অনুসারে বা মানচিত্র তৈরির সময় সরবরাহকারী কোনও তুলনাকারী অনুসারে বাছাই করা হয়।

: তিনটি তার অধিকাংশই দরকারী বাস্তবায়নের হয় TreeMap , ImmutableSortedMap এবং ConcurrentSkipListMap

ট্রি ম্যাপ উদাহরণ:

TreeMap<String, Integer> users = new TreeMap<String, Integer>();
users.put("Bob", 1);
users.put("Alice", 2);
users.put("John", 3);

for (String key: users.keySet()) {
  System.out.println(key + " (ID = "+ users.get(key) + ")");
}

আউটপুট:

Alice (ID = 2)
Bob (ID = 1)
John (ID = 3)



2

TL; ড

Map< Integer , String >কী অনুসারে বাছাই করা আদেশ রাখতে , SortedMap/ NavigableMapইন্টারফেস প্রয়োগকারী দুটি শ্রেণির যে কোনও একটি ব্যবহার করুন:

  • TreeMap
  • ConcurrentSkipListMap

যদি একক থ্রেডের মধ্যে মানচিত্রটি চালিত হয় তবে প্রথমটি, ব্যবহার করুন TreeMap। থ্রেড জুড়ে কারসাজি করা, দ্বিতীয় ব্যবহার করুন ConcurrentSkipListMap,।

বিশদগুলির জন্য, নীচের সারণী এবং নীচের আলোচনাটি দেখুন।

বিস্তারিত

এখানে একটি গ্রাফিক টেবিল যা আমি Mapজাভা 11 এর সাথে বান্ডিল করা দশটি বাস্তবায়নের বৈশিষ্ট্যগুলি দেখিয়েছি ।

NavigableMapইন্টারফেস কি SortedMapপ্রথম স্থানে হওয়া উচিত ছিল। SortedMapকথাটি সরানো উচিত কিন্তু কিছু 3rd পক্ষের মানচিত্র বাস্তবায়নের ইন্টারফেস ব্যবহার করে থাকতে পারেন হতে পারে না।

আপনি এই টেবিলটিতে দেখতে পাচ্ছেন, কেবল দুটি শ্রেণি SortedMap/ NavigableMapইন্টারফেস প্রয়োগ করে :

এই উভয়ই চাবিগুলি সাজানো ক্রমে রাখে, হয় তাদের প্রাকৃতিক আদেশ compareToঅনুসারে Comparable( https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ এর পদ্ধতি ব্যবহার করে) তুলনাযোগ্য html ) ইন্টারফেস) বা কোনও Comparatorপাসপোর্টের মাধ্যমে আপনি পাস করেন। এই দুটি শ্রেণীর মধ্যে পার্থক্য হচ্ছে দ্বিতীয়টি হল, ConcurrentSkipListMapহল থ্রেড-নিরাপদ , অত্যন্ত সমবর্তী

আরও দেখুন পুনরাবৃত্তিতে অর্ডার নীচের টেবিলে কলাম।

  • LinkedHashMapশ্রেণী ক্রমে তারা ছিল তার এন্ট্রি ফেরৎ মূলত সন্নিবেশিত
  • EnumMapকীগুলির এনাম শ্রেণি সংজ্ঞায়িত করা হয় তার ক্রমে এন্ট্রিগুলি প্রদান করে । উদাহরণস্বরূপ, কোন কর্মচারীর একটি মানচিত্র সপ্তাহের কোন দিন ( Map< DayOfWeek , Person >) DayOfWeekজাভাতে অন্তর্নির্মিত এনাম শ্রেণিটি ব্যবহার করে তা covering াকছে। সেই এনামটি সোমবার প্রথম এবং রবিবারের সাথে সংজ্ঞায়িত করা হয়েছে। সুতরাং একটি পুনরাবৃত্তিতে প্রবেশের ক্রমগুলি প্রদর্শিত হবে।

অন্য ছয়টি বাস্তবায়ন তারা যাতে তাদের এন্ট্রিগুলি প্রতিবেদন করে সে বিষয়ে কোনও প্রতিশ্রুতি দেয় না।

জাভা 11 এ তাদের বৈশিষ্ট্যগুলির তুলনা করে মানচিত্রের প্রয়োগের টেবিল


0

আমি মানচিত্রের মান অনুসারে বাছাই করার জন্য সরল হ্যাশ মানচিত্র, সংযুক্ত তালিকা এবং সংগ্রহগুলি ব্যবহার করেছি ।

import java.util.*;
import java.util.Map.*;
public class Solution {

    public static void main(String[] args) {
        // create a simple hash map and insert some key-value pairs into it
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("Python", 3);
        map.put("C", 0);
        map.put("JavaScript", 4);
        map.put("C++", 1);
        map.put("Golang", 5);
        map.put("Java", 2);
        // Create a linked list from the above map entries
        List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet());
        // sort the linked list using Collections.sort()
        Collections.sort(list, new Comparator<Entry<String, Integer>>(){
        @Override
         public int compare(Entry<String, Integer> m1, Entry<String, Integer> m2) {
        return m1.getValue().compareTo(m2.getValue());
        }
      });
      for(Entry<String, Integer> value: list) {
         System.out.println(value);
     }
   }
}

আউটপুটটি হ'ল:

C=0
C++=1
Java=2
Python=3
JavaScript=4
Golang=5
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.