জাভা সেট অর্ডার ধরে রাখতে?


179

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


3
"উপাদানগুলি কোনও নির্দিষ্ট ক্রমে ফিরে আসে (যদি না এই সেটটি কোনও শ্রেণীর উদাহরণ দেয় যা গ্যারান্টি সরবরাহ করে)"। একটি সেট জন্য পুনরুক্তি পদ্ধতি কি বলে। এখানে
কীজার 25'12

উত্তর:


256

Setইন্টারফেস কোনো ক্রম গ্যারান্টী প্রদান করে না।

এর উপ-ইন্টারফেসটি SortedSetএমন একটি সেট উপস্থাপন করে যা কিছু মানদণ্ড অনুসারে বাছাই করা হয়। জাভা 6 এ, দুটি স্ট্যান্ডার্ড পাত্রে রয়েছে যা প্রয়োগ করে SortedSet। তারা TreeSetএবং ConcurrentSkipListSet

ছাড়াও SortedSetইন্টারফেস, রয়েছে LinkedHashSetবর্গ। এটি সেটের মধ্যে যে উপাদানগুলিকে সন্নিবেশ করা হয়েছিল সেটিকে মনে রাখে এবং তার উপাদানগুলিকে সেই ক্রমে ফিরিয়ে দেয়।


21
তদুপরি, জাভা 8- এ বিভিন্ন স্ট্রিং হ্যাশিংয়ের কারণে, সেট এবং মানচিত্রে ডিফল্ট (অরসোর্টড) ক্রম পরিবর্তন হবে। আপনি পাঁচমিশালী ক্রম উপর নির্ভর করেন, তাহলে আপনার কোড জাভা 8. অধীনে ভিন্নভাবে আচরণ করবে
rustyx

আমি পেয়েছি যে শ্রেণিটি অর্ডার দিচ্ছে না তা স্বাভাবিক, তবে আমি যে আচরণের প্রত্যাশা করছিলাম তা হ'ল তাদের প্রবর্তিত হওয়ায় এবং আদেশের সাথে গণ্ডগোল নয়, পরিবর্তে এটি প্রতিবার একত্রিত হওয়ার পরে উপাদানগুলিকে বদলে দেওয়া হচ্ছে। আপনার সমাধানটি সর্বোত্তম নয়, কারণ তাদের পরে সাজানোর জন্য আমাকে পুরো কাঠামো প্রয়োগ করতে হবে তারা
যেভাবে

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

103

লিংকডহ্যাশসেটটি আপনার যা প্রয়োজন।


43
Listএকটি নয় Set(এটি সদস্যপদের স্বতন্ত্রতার গ্যারান্টি দেয় না)।
সীমাবদ্ধ প্রায়শ্চিত্ত

10
অনেক ব্যবসায় অনন্য ক্ষেত্রে তালিকার সেট পরিবর্তে কেবল অর্ডার ধরে রাখতে ব্যবহার করা যায় না। লিংকডহ্যাশট অর্ডার বজায় রাখে এবং স্টোরগুলিকে অনন্য করে।
গাবস

18

অনেকগুলি সংগ্রহের ক্রম ধরে রাখতে লিংকডহ্যাশসেট ব্যবহারের পরামর্শ দিয়েছেন । আপনি এই প্রয়োগটি ব্যবহার করে আপনার সেটটি মোড়ানো করতে পারেন।

বাছাই করা অর্ডারের জন্য सॉোর্টসেট বাস্তবায়ন ব্যবহার করা যেতে পারে তবে আপনার উদ্দেশ্যে লিংকডহ্যাশসেট ব্যবহার করুন ।

ডক্স থেকেও,

"এই বাস্তবায়নটি ট্রিটসেটের সাথে সম্পর্কিত বর্ধিত ব্যয় ব্যয় না করে হ্যাশসেটের দ্বারা সরবরাহ করা অনির্ধারিত, সাধারণত বিশৃঙ্খলা অর্ডার থেকে তার ক্লায়েন্টকে ছাড়িয়ে যায় It এটি কোনও সেটের অনুলিপি তৈরি করতে ব্যবহার করা যেতে পারে যা মূল হিসাবে নির্বিশেষে মূল হিসাবে একই আদেশ রয়েছে সেট এর বাস্তবায়ন: "

সূত্র: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html


9

সেটটি কেবল একটি ইন্টারফেস। অর্ডার ধরে রাখতে, আপনাকে সেই ইন্টারফেসের একটি নির্দিষ্ট প্রয়োগ এবং সাব-ইন্টারফেস सॉোর্টসেট ব্যবহার করতে হবে, উদাহরণস্বরূপ ট্রিসেট বা লিংকডহ্যাশসেট। আপনি আপনার সেটটি এইভাবে মোড়ানো করতে পারেন:

Set myOrderedSet = new LinkedHashSet(mySet);

7

এখানে Setজাভাতে উপলব্ধ স্ট্যান্ডার্ড বাস্তবায়নের ক্রম বৈশিষ্ট্যের একটি দ্রুত সংক্ষিপ্তসার রয়েছে :

  1. সন্নিবেশ অর্ডার রাখবেন: LinkedHashSet এবং CopyOnWriteArraySet (থ্রেড-নিরাপদ)
  2. আইটেমগুলিকে সেটের মধ্যে বাছাই করুন: ট্রিসেট , এনামসেট ( এনামগুলির জন্য নির্দিষ্ট) এবং সমকালীন স্কিপলিস্টসেট (থ্রেড-নিরাপদ)
  3. আইটেমগুলিকে কোনও নির্দিষ্ট ক্রমে রাখে না: হ্যাশসেট (আপনি যে চেষ্টা করেছেন)

আপনার নির্দিষ্ট ক্ষেত্রে, যদি আপনি পারেন সাজানোর আইটেম প্রথম এবং তারপর এর 1 বা 2 (সম্ভবত কোন ব্যবহার করতে পারেন LinkedHashSetবা TreeSet)। অথবা বিকল্পভাবে এবং আরও দক্ষতার সাথে আপনি কেবল এমন কোনও অনার্টার্ড ডেটা যুক্ত করতে পারেন TreeSetযা আপনার জন্য স্বয়ংক্রিয়ভাবে বাছাইয়ের যত্ন নেবে।



5

একটি লিংকডহ্যাশসেট হ্যাশসেটের একটি আদেশযুক্ত সংস্করণ যা সমস্ত উপাদানগুলিতে দ্বিগুণ-সংযুক্ত তালিকা বজায় রাখে। যখন আপনি পুনরাবৃত্তি আদেশের বিষয়ে যত্নশীল হ্যাশসেটের পরিবর্তে এই শ্রেণিটি ব্যবহার করুন।


3

জাভাডোক থেকে Set.iterator():

এই সেটের উপাদানগুলির উপর একটি পুনরাবৃত্তিকে ফেরত দেয়। উপাদানগুলি কোনও নির্দিষ্ট ক্রমে ফিরে আসে না (যদি না এই সেটটি কোনও শ্রেণীর উদাহরণ দেয় যা গ্যারান্টি সরবরাহ করে)।

এবং, যেমন ইতিমধ্যে শুচান বলেছিলেন , ক এটিরTreeSet একটি প্রয়োগ Setযার একটি নিশ্চিত আদেশ রয়েছে:

উপাদানগুলি তাদের প্রাকৃতিক ক্রম ব্যবহার করে বা সেট তৈরির সময় সরবরাহকারী কোনও তুলনাকারী দ্বারা নির্ধারিত হয়, কোনটি কনস্ট্রাক্টর ব্যবহার করা হবে তার উপর নির্ভর করে।


3

সাধারণত সেটটি অর্ডার রাখে না, যেমন হ্যাশসেট দ্রুত একটি ইমেলেন্ট সন্ধানের জন্য, তবে আপনি লিংকডহ্যাশসেট চেষ্টা করতে পারেন এটি আপনার যে আদেশটি রেখেছিল তা ঠিক রাখবে।


1

2 টি আলাদা জিনিস আছে।

  1. উপাদানগুলিকে একটি সেটে বাছাই করুন। যার জন্য আমাদের सॉোর্টসেট এবং অনুরূপ বাস্তবায়ন রয়েছে।
  2. একটি সেটে সন্নিবেশ ক্রম বজায় রাখুন। যার জন্য লিংকডহ্যাশসেট এবং কপিঅনওয়াইরাইটআর্রেসেট (থ্রেড-নিরাপদ) ব্যবহার করা যেতে পারে।



-2

শুধুমাত্র SortedSetআদেশ ক্রম করতে পারেনSet


প্রশ্নটি সন্নিবেশ ক্রম ধরে রাখার বিষয়ে (যা সাজানোর ক্ষেত্রে ঘটে)।
অ্যাসিলিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.