আমি জানি LinkedHashMapএকটি পূর্বাভাসযোগ্য পুনরাবৃত্তি আদেশ আছে (সন্নিবেশ ক্রম)। Setদ্বারা LinkedHashMap.keySet()এবং ফিরে কিCollection ফিরে দ্বারা LinkedHashMap.values()এই শৃঙ্খলা বজায় রাখার?
আমি জানি LinkedHashMapএকটি পূর্বাভাসযোগ্য পুনরাবৃত্তি আদেশ আছে (সন্নিবেশ ক্রম)। Setদ্বারা LinkedHashMap.keySet()এবং ফিরে কিCollection ফিরে দ্বারা LinkedHashMap.values()এই শৃঙ্খলা বজায় রাখার?
উত্তর:
মানচিত্র ইন্টারফেসটি তিনটি সংগ্রহের ভিউ সরবরাহ করে , যা মানচিত্রের বিষয়বস্তুগুলিকে কীগুলির সেট, মান সংগ্রহ, বা কী-মান ম্যাপিংয়ের সেট হিসাবে দেখার অনুমতি দেয়। অর্ডার একটি মানচিত্রের যে ক্রমে মানচিত্রের সংগ্রহ ভিউ-এ iterators তাদের উপাদান ফিরে হিসাবে সংজ্ঞায়িত করা হয়।
TreeMapশ্রেণীর মতো কিছু মানচিত্রের প্রয়োগগুলি তাদের আদেশ সম্পর্কে নির্দিষ্ট গ্যারান্টি দেয়; অন্যদের,HashMapক্লাস মত , না।
- মানচিত্র
এই লিঙ্কযুক্ত তালিকাটি পুনরাবৃত্তির ক্রম সংজ্ঞায়িত করে, যা সাধারণত ম্যাপে কীগুলি সন্নিবেশ করানো হয় ( সন্নিবেশ-ক্রম )।
তাই, হ্যাঁ, keySet(), values(), এবং entrySet()অনুক্রমে (তিন সংগ্রহ মতামত উল্লিখিত) আগমন মান অভ্যন্তরীণ লিঙ্ক তালিকা ব্যবহার করে। এবং হ্যাঁ, জাভাডক Mapএবং এর জন্যLinkedHashMap এটা গ্যারান্টি।
সর্বোপরি এই শ্রেণীর পয়েন্ট এটি।
Collectionহ'ল মান () কী দেয় তার জন্য কেবলমাত্র বেস ক্লাস। এটি প্রদত্ত সংগ্রহটির বাস্তবায়ন এখনও দ্বারা নিয়ন্ত্রণ করা হয় LinkedHashMap। ইন LinkedHashMapএর ক্ষেত্রে, এটি একটি ফিরে পাবে LinkedValuesউদাহরণস্বরূপ, LinkedHashMap.java ভিতরে একটি প্রাইভেট বর্গ।
Map) যা মানচিত্রের সংগ্রহের ভিউগুলিতে পুনরাবৃত্তিকারীদের সাথে একটি মানচিত্রের ক্রমটি স্পষ্টভাবে সংযুক্ত করে (এবং সেই সংগ্রহের দর্শনগুলি কী তা পরিষ্কার করে দেয়)। এটা আমার জন্য অনুপস্থিত অংশ ছিল।
উত্সের দিকে তাকিয়ে দেখে মনে হচ্ছে এটি ঠিক আছে। keySet(), values()এবং entrySet()সমস্ত একই অভ্যন্তর পুনরুক্তি অভ্যন্তরীণভাবে ব্যবহার করে।
বিভ্রান্ত LinkedHashMap.keySet()এবং LinkedHashMap.entrySet()সেট ফিরে আসবেন না এবং তাই এটি আদেশের গ্যারান্টি দেওয়া উচিত নয়!
Setসঙ্গে একটি ইন্টারফেস HashSet, TreeSetইত্যাদি মানুষ তার বাস্তবায়নের। HashSetবাস্তবায়নSet ইন্টারফেস ক্রম গ্যারান্টী বা নিশ্চয়তা দিচ্ছে না। কিন্তু TreeSetনা। এছাড়াও LinkedHashSetকরে।
সুতরাং এটি কীভাবে Setবাস্তবায়িত হয়েছে LinkedHashMapতা রিটার্নিং সেট রেফারেন্সটি অর্ডার দেওয়ার গ্যারান্টি দেবে কিনা তার উপর নির্ভর করে । আমি এর সোর্স কোড দিয়েছিলামLinkedHashMap , এটি দেখতে এটির মতো দেখাচ্ছে:
private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}
সুতরাং লিঙ্কডহ্যাশম্যাপ / হ্যাশম্যাপের নিজস্ব প্রয়োগ রয়েছে has Set অর্থাত KeySet। সুতরাং এটি দিয়ে বিভ্রান্ত করবেন নাHashSet ।
এছাড়াও, কীভাবে উপাদানগুলি বালতিতে areোকানো হয় তার মাধ্যমে ক্রম বজায় থাকে। এর addEntry(..)পদ্ধতিটি দেখুন LinkedHashMapএবং এর সাথে এটির তুলনা করুন HashMapযা এর মধ্যে HashMapএবং এর মধ্যে মূল পার্থক্য তুলে ধরে LinkedHashMap।
আপনি ধরে নিতে পারেন। Javadoc বলছেন 'আন্দাজের পুনরাবৃত্তির অর্ডার', এবং শুধুমাত্র একটি মানচিত্র পাওয়া iterators হয় () keySet (), entrySet (), এবং মান জন্য ঐ।
সুতরাং আর কোনও যোগ্যতার অভাবে এটি স্পষ্টভাবে ite সমস্ত পুনরাবৃত্তকারীদের জন্য প্রয়োগ করা।
আফাইক এটি নথিভুক্ত নয় তাই আপনি "আনুষ্ঠানিকভাবে" ধরে নিতে পারেন না। বর্তমান বাস্তবায়ন যে পরিবর্তিত হবে এটি সম্ভাবনা কম is
আপনি যদি অর্ডার নিশ্চিত করতে চান তবে আপনি মানচিত্রটি প্রবেশের মাধ্যমে পুনরাবৃত্তি করতে এবং এটিকে আপনার পছন্দের অর্ডার ফাংশন সহ একটি সাজানো সেটটিতে সন্নিবেশ করতে চাইতে পারেন, যদিও আপনি প্রাকৃতিকভাবে কোনও পারফরম্যান্স ব্যয় প্রদান করবেন।
ইন্টারফেসের দিকে তাকালে এটি একটি Setনা বরং একটি সমতল দেয়SortedSet । সুতরাং কোন গ্যারান্টি আছে।
বাস্তবায়ন (সর্বদা একটি খারাপ ধারণা) দেখে জাতির গ্যারান্টি ধরে নেওয়ার আগে অন্যান্য সমস্ত জাভা বাস্তবায়নের বাস্তবায়নগুলিও দেখুন:
আপনি কনস্ট্রাক্টরের কীসেট সহ উদাহরণস্বরূপ একটি ট্রিসেট তৈরি করতে পারেন।
আমি মনে করি না আপনি কীসেট () এবং মানগুলি () এর ক্রম অনুমান করতে পারেন।
আমি সহজেই লিংকডহ্যাশম্যাপের একটি বাস্তবায়ন লিখতে পারি যা আপনাকে আনর্ডারড কীসেট () এবং মানগুলি () প্রদান করে, যতক্ষণ না আমি মানচিত্রে সংজ্ঞায়িত এই দুটি পদ্ধতির চুক্তিতে অবিচল থাকি এবং হ্যাশম্যাপে ওভাররাইড করা হয়।
LinkedHashMapশ্রেণীর পুরো উদ্দেশ্য হ'ল মানচিত্রটি পুনরাবৃত্তি করার সময় উপাদানগুলির ক্রম রাখা এবং এই আচরণটি ভালভাবে সুনির্দিষ্ট। আপনি যদি বেস ক্লাসের নির্দিষ্টকরণের সাথে সম্মতি না রেখে সাবক্লাস লিখে থাকেন তবে আপনি খুব ভুল করছেন।
values()এটিকেkeySet()অন্তর্ভুক্ত করার জন্য প্রশ্নটি প্রসারিত করেছি। এর অর্থ এটির সদৃশ হিসাবে আরও প্রশ্নগুলি বন্ধ করা যেতে পারে।