লিংকডহ্যাশম্যাপ অবজেক্ট থেকে কীগুলি এবং মানগুলি ফেরত দেওয়ার জন্য কি অর্ডারটি গ্যারান্টিযুক্ত?


162

আমি জানি LinkedHashMapএকটি পূর্বাভাসযোগ্য পুনরাবৃত্তি আদেশ আছে (সন্নিবেশ ক্রম)। Setদ্বারা LinkedHashMap.keySet()এবং ফিরে কিCollection ফিরে দ্বারা LinkedHashMap.values()এই শৃঙ্খলা বজায় রাখার?


1
যেহেতু সমস্ত উত্তর ইস্যুটিকেও সম্বোধন করে, তাই আমি values()এটিকে keySet()অন্তর্ভুক্ত করার জন্য প্রশ্নটি প্রসারিত করেছি। এর অর্থ এটির সদৃশ হিসাবে আরও প্রশ্নগুলি বন্ধ করা যেতে পারে।
ডানকান জোনস

উত্তর:


226

মানচিত্র ইন্টারফেসটি তিনটি সংগ্রহের ভিউ সরবরাহ করে , যা মানচিত্রের বিষয়বস্তুগুলিকে কীগুলির সেট, মান সংগ্রহ, বা কী-মান ম্যাপিংয়ের সেট হিসাবে দেখার অনুমতি দেয়। অর্ডার একটি মানচিত্রের যে ক্রমে মানচিত্রের সংগ্রহ ভিউ-এ iterators তাদের উপাদান ফিরে হিসাবে সংজ্ঞায়িত করা হয়। TreeMap শ্রেণীর মতো কিছু মানচিত্রের প্রয়োগগুলি তাদের আদেশ সম্পর্কে নির্দিষ্ট গ্যারান্টি দেয়; অন্যদের, HashMapক্লাস মত , না।

- মানচিত্র

এই লিঙ্কযুক্ত তালিকাটি পুনরাবৃত্তির ক্রম সংজ্ঞায়িত করে, যা সাধারণত ম্যাপে কীগুলি সন্নিবেশ করানো হয় ( সন্নিবেশ-ক্রম )।

- লিংকডহ্যাশম্যাপ

তাই, হ্যাঁ, keySet(), values(), এবং entrySet()অনুক্রমে (তিন সংগ্রহ মতামত উল্লিখিত) আগমন মান অভ্যন্তরীণ লিঙ্ক তালিকা ব্যবহার করে। এবং হ্যাঁ, জাভাডক Mapএবং এর জন্যLinkedHashMap এটা গ্যারান্টি।

সর্বোপরি এই শ্রেণীর পয়েন্ট এটি।


8
একটি মানচিত্রে পুনরাবৃত্তিটি হ্যাশম্যাপের চেয়ে লিংকডহ্যাশম্যাপ ব্যবহার করে দ্রুত করা হয়।
থিয়েরি

2
মানগুলি () একটি সংগ্রহ প্রদান করে। একটি তালিকা নয়। কীভাবে এটি ঠিক রাখে?
দেজেল

7
@ ডিজেল Collectionহ'ল মান () কী দেয় তার জন্য কেবলমাত্র বেস ক্লাস। এটি প্রদত্ত সংগ্রহটির বাস্তবায়ন এখনও দ্বারা নিয়ন্ত্রণ করা হয় LinkedHashMap। ইন LinkedHashMapএর ক্ষেত্রে, এটি একটি ফিরে পাবে LinkedValuesউদাহরণস্বরূপ, LinkedHashMap.java ভিতরে একটি প্রাইভেট বর্গ।
পাওয়ারলর্ড

2
আমার ক্ষেত্রে একটি লিঙ্কডহ্যাশম্যাপের কীসেট মানচিত্রে উপস্থাপিত ক্রমে নেই। এ দেখে খুব আশ্চর্য হয়ে গেলেন।
অমলগোভিনাস

2
ডকুমেন্টেশনের সাথে লিঙ্ক করার জন্য ধন্যবাদ (থেকে Map) যা মানচিত্রের সংগ্রহের ভিউগুলিতে পুনরাবৃত্তিকারীদের সাথে একটি মানচিত্রের ক্রমটি স্পষ্টভাবে সংযুক্ত করে (এবং সেই সংগ্রহের দর্শনগুলি কী তা পরিষ্কার করে দেয়)। এটা আমার জন্য অনুপস্থিত অংশ ছিল।
লার্শ

11

উত্সের দিকে তাকিয়ে দেখে মনে হচ্ছে এটি ঠিক আছে। keySet(), values()এবং entrySet()সমস্ত একই অভ্যন্তর পুনরুক্তি অভ্যন্তরীণভাবে ব্যবহার করে।


1
ভান্ডারগুলির সাথে একটি লিঙ্ক থাকা ভাল হবে তবে আমি অলস :-) এবং অবশ্যই এটি সামনের সামঞ্জস্যের গ্যারান্টি নয়।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

6

বিভ্রান্ত 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


4
যদিও এই উত্তরটি অবশ্যই কার্যকর তথ্য উপস্থাপন করে, সত্যই এটি প্রশ্নের উত্তর দেয় না। এটি মূলত বলছে যে তারা অনুমানযোগ্য পুনরাবৃত্তি ক্রম থাকতে পারে।
টিউপার্টুনট

5

আপনি ধরে নিতে পারেন। Javadoc বলছেন 'আন্দাজের পুনরাবৃত্তির অর্ডার', এবং শুধুমাত্র একটি মানচিত্র পাওয়া iterators হয় () keySet (), entrySet (), এবং মান জন্য ঐ।

সুতরাং আর কোনও যোগ্যতার অভাবে এটি স্পষ্টভাবে ite সমস্ত পুনরাবৃত্তকারীদের জন্য প্রয়োগ করা।


0

আফাইক এটি নথিভুক্ত নয় তাই আপনি "আনুষ্ঠানিকভাবে" ধরে নিতে পারেন না। বর্তমান বাস্তবায়ন যে পরিবর্তিত হবে এটি সম্ভাবনা কম is

আপনি যদি অর্ডার নিশ্চিত করতে চান তবে আপনি মানচিত্রটি প্রবেশের মাধ্যমে পুনরাবৃত্তি করতে এবং এটিকে আপনার পছন্দের অর্ডার ফাংশন সহ একটি সাজানো সেটটিতে সন্নিবেশ করতে চাইতে পারেন, যদিও আপনি প্রাকৃতিকভাবে কোনও পারফরম্যান্স ব্যয় প্রদান করবেন।


আপনার কী অর্থ এন্ট্রিসেট () কী-সেট () না করে আদেশের গ্যারান্টি দেয়?
ব্যবহারকারী 256239

1
@ কেকনাইট: আমি নিশ্চিত নই জাভাডোক বলেছেন: "এই লিঙ্কযুক্ত তালিকাগুলি পুনরাবৃত্তির ক্রম সংজ্ঞায়িত করে, যা সাধারণত ম্যাপে কীগুলি সন্নিবেশ করানো হয় (সন্নিবেশ-ক্রম)"। তবে জেডিকে জাভাডোকগুলি সাধারণভাবে খুব অস্পষ্ট।
উরি

5
এমনকি যদি এন্ট্রিসেট () পুনরাবৃত্তি আদেশের গ্যারান্টি না দেয় তবে লিংকডহ্যাশম্যাপ এবং হ্যাশম্যাপের মধ্যে পার্থক্য কী? কীভাবে আমরা লিঙ্কডহ্যাশম্যাপে অনুমানযোগ্য পুনরাবৃত্তি আদেশের সুবিধা নিতে পারি?
ব্যবহারকারী 256239

1
এটা অবশ্যই হয় নথিভুক্ত। উত্তর সম্পূর্ণ ভুল।
লার্নের মারকুইস

-3

ইন্টারফেসের দিকে তাকালে এটি একটি Setনা বরং একটি সমতল দেয়SortedSet । সুতরাং কোন গ্যারান্টি আছে।

বাস্তবায়ন (সর্বদা একটি খারাপ ধারণা) দেখে জাতির গ্যারান্টি ধরে নেওয়ার আগে অন্যান্য সমস্ত জাভা বাস্তবায়নের বাস্তবায়নগুলিও দেখুন:

আপনি কনস্ট্রাক্টরের কীসেট সহ উদাহরণস্বরূপ একটি ট্রিসেট তৈরি করতে পারেন।


3
ডকুমেন্টেশন ঘনিষ্ঠভাবে খুঁজছেন, নিশ্চয়ই গ্যারান্টি আছে। যেমন কেউ ইতিমধ্যে লিখেছেন, এটি এই শ্রেণীর একেবারে পয়েন্ট।
glglgl

-4

আমি মনে করি না আপনি কীসেট () এবং মানগুলি () এর ক্রম অনুমান করতে পারেন।

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


6
LinkedHashMapশ্রেণীর পুরো উদ্দেশ্য হ'ল মানচিত্রটি পুনরাবৃত্তি করার সময় উপাদানগুলির ক্রম রাখা এবং এই আচরণটি ভালভাবে সুনির্দিষ্ট। আপনি যদি বেস ক্লাসের নির্দিষ্টকরণের সাথে সম্মতি না রেখে সাবক্লাস লিখে থাকেন তবে আপনি খুব ভুল করছেন।
জাকিনস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.