জাভা.ইটিল.সেট কেন পায় না (ইনটেক্স ইনডেক্স)?


237

আমি নিশ্চিত যে এর কোনও যুক্তিসঙ্গত কারণ আছে তবে কেউ দয়া করে ব্যাখ্যা করতে পারেন কেন java.util.Setইন্টারফেসের অভাব get(int Index), বা অনুরূপ কোনও get()পদ্ধতি রয়েছে?

দেখে মনে হয় যে জিনিসগুলি puttingোকানোর জন্য সেটগুলি দুর্দান্ত, তবে আমি এটি থেকে কোনও একক আইটেম পুনরুদ্ধারের একটি দুর্দান্ত উপায় খুঁজে পাচ্ছি না।

আমি যদি জানি যে আমি প্রথম আইটেমটি চাই, আমি ব্যবহার করতে পারি set.iterator().next(), তবে অন্যথায় মনে হয় নির্দিষ্ট সূচীতে কোনও আইটেম উদ্ধার করতে আমাকে অ্যারেতে কাস্ট করতে হবে?

কোনও সেট থেকে ডেটা পুনরুদ্ধারের উপযুক্ত উপায়গুলি কী কী? (একটি পুনরাবৃত্তকারী ব্যবহার ব্যতীত)

আমি নিশ্চিত যে এপিআই থেকে বর্জনিত হওয়ার অর্থ এই না করার উপযুক্ত কারণ রয়েছে - কেউ দয়া করে আমাকে আলোকিত করতে পারে?

সম্পাদনা: এখানে কয়েকটি অত্যন্ত দুর্দান্ত উত্তর, এবং কিছু "আরও প্রসঙ্গ" বলছেন। নির্দিষ্ট দৃশ্যটি ছিল একটি ডিবিউনিট পরীক্ষা, যেখানে আমি যুক্তিসঙ্গতভাবে বলতে পারি যে কোনও জিজ্ঞাসা থেকে ফিরে আসা সেটটিতে কেবলমাত্র 1 টি আইটেম ছিল এবং আমি সেই আইটেমটি অ্যাক্সেস করার চেষ্টা করছি।

তবে, পরিস্থিতিটি ছাড়াই প্রশ্নটি আরও বৈধ, কারণ এটি আরও বেশি কেন্দ্রীভূত থাকে:

সেট এবং তালিকার মধ্যে পার্থক্য কী

নীচের চমত্কার উত্তরের জন্য সকলকে ধন্যবাদ।


1
কেন আপনি সূচী দ্বারা সেট থেকে একটি উপাদান পাবেন? আপনি কি একটি সেট বাছাই করা অ্যারে হিসাবে ব্যবহার করার চেষ্টা করছেন?
এমএসএএন

হাইবারনেট কল থেকে ফিরে আসা সেটটির বিরুদ্ধে এখানে বিশেষ উদাহরণটি হ'ল ডিবিউনিট পরীক্ষা। আমার পরীক্ষায়, এটি ধরে নেওয়া যুক্তিযুক্ত (কারণ আমি এটি দৃ it়ভাবে জানিয়েছি) যে প্রত্যাবর্তন করা বস্তুটি একটি নির্দিষ্ট ক্রমে রয়েছে, আমার আইডিটাসেটের কারণে আমি এটি সেট আপ করতাম। এটি একটি অ-সাধারণ ঘটনা, তবে এপিআই সম্পর্কে আমার কৌতূহলকে বাড়ে।
মার্টি পিট

1
নির্দিষ্ট ক্রমে জিনিস যুক্ত করার অর্থ এই নয় যে তারা পছন্দমতো সেট প্রয়োগটি ব্যবহার না করা না হলে তারা সেভাবেই থাকবে।
মাইকেল ম্যাইইয়ার্স

1
"যদি আমি জানি যে আমি প্রথম আইটেমটি চাই, আমি সেট.ইেট্রেটর () ব্যবহার করতে পারি can পরবর্তী ()" - এই লাইনটি আসলে কোনও অর্থবোধ করে না। আপনি সত্যিই বলছেন "যদি আমি জানতে পারি যে আমি প্রথম আইটেমটি প্রয়োগ করতে চাই, প্রথম আইটেমটির প্রয়োগের সংজ্ঞা দিয়ে, তবে আমি করতে পারি ..."। সেটটি নিজেই অর্ডারড নয়, সুতরাং সূচিবদ্ধ অ্যাক্সেসটি বোঝায় না। এখন যদি একটি অ্যারেলিস্টসেট থাকে, তবে এটি আরও অর্থবোধ করতে পারে (কেবল "তালিকার জন্য প্রস্তুত" এবং খুশি হবেন)। আপনি প্রশ্নের আরও প্রসঙ্গ দিতে পারে?
জাস্টাইট

সেটটি অর্ডারর্ডার নয়! এর কয়েকটি বাস্তবায়ন হ'ল, তবে কিছু বাস্তবায়ন স্পষ্টভাবে একটি নির্দিষ্ট উপায়ে অর্ডার করা হয়।
রিনিয়ারপোস্ট 17

উত্তর:


176

কারণ সেটের কোনও অর্ডার নেই। কিছু বাস্তবায়ন করে (বিশেষত java.util.SortedSetইন্টারফেস প্রয়োগকারীরা ), তবে এটি কোনও সাধারণ সম্পত্তি নয়।

আপনি যদি এইভাবে সেট ব্যবহার করার চেষ্টা করছেন তবে পরিবর্তে একটি তালিকা ব্যবহার করা আপনার বিবেচনা করা উচিত।


10
@ ম্যাট বি: না, আমার মনে হয় তাঁর এটি বিবেচনা করা উচিত। ভাবনা ভাল is ;)
মাইকেল ম্যাইইয়ার্স

10
এটি বিবেচনা করুন, তারপর এটি।
জো ফিলিপস

21
"বিবেচনা করুন" সঠিক শব্দচয়ন sing দুটি সম্ভাব্য সমস্যা রয়েছে (ক) সে যখন সেট ব্যবহার করছে তখন অন্য কিছু ব্যবহার করা উচিত, বা (খ) সেটসের সাথে এমন জিনিস করার চেষ্টা করা হচ্ছে যা তারা সমর্থন করে না তবে সে অন্যভাবে করতে পারে। এর মধ্যে কেসের বিষয়টি বিবেচনা করা ভাল ।
kenj0418

6
সহজ উত্তর হতে পারে একটি সাজানো সেট ব্যবহার করা। (আমি ধরে নিই যে সেটটি বেছে নেওয়ার সময় স্বতন্ত্রতা অংশ নিয়েছিল)। তবে আমার একটি প্রশ্ন আছে, যেহেতু সোর্টসেটটি অর্ডার করা হয়েছে, কেন এপিআইতে কোনও উপায় পদ্ধতি নেই।
uncaught_exferences 9

5
@ এইচডি ডেভ: না, কোনও তথ্য কাঠামোর একাধিক প্রয়োগ কোনও সম্পত্তি ভাগ করে নেওয়ার বিষয়টি এটিকে নিজেই ডেটা স্ট্রাকচারের সম্পত্তি হিসাবে পরিণত করে না। তালিকার (অ্যারেলিস্ট এবং ভেক্টর) তিনটি ব্যবহার করা সাধারণ প্রয়োগগুলির মধ্যে দু'টি এলোমেলোভাবে অ্যাক্সেস করে তবে এটি এলোমেলোভাবে তালিকাভুক্তির কোনও সম্পত্তি অ্যাক্সেস করে না।
মাইকেল মায়ার্স

74

আসলে জাভাইই অ্যাপ্লিকেশনগুলি লেখার সময় এটি একটি পুনরাবৃত্ত প্রশ্ন যা অবজেক্ট-রিলেশনাল ম্যাপিং ব্যবহার করে (উদাহরণস্বরূপ হাইবারনেট সহ); এবং এখানে যে সমস্ত লোকেরা জবাব দিয়েছে তাদের মধ্য থেকেই, আন্দ্রেস পিটারসনই হলেন যারা আসল বিষয়টি বুঝতে পেরেছিলেন এবং এর সঠিক উত্তর দিয়েছেন: জাভা একটি ইউনিকলিস্ট মিস করছেন! (বা আপনি এটিকে অর্ডারডসেট বা ইনডেক্সডসেটও বলতে পারেন)।

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

এই "ইনডেক্সডসেট" একটি সর্ডারেটসেটের সমান নয় - একটি সাজানোসেটে উপাদানগুলি তুলনামূলক ব্যবহার করে বা তাদের "প্রাকৃতিক" ক্রম ব্যবহার করে বাছাই করা হয়)।

তবে পরিবর্তে এটি একটি লিংকডহ্যাশসেটের নিকটে (এটি অন্যরাও বলেছিল), বা আরও একটি (অযৌক্তিক) "অ্যারেলিস্টসেট" এরও কাছে, কারণ এটি গ্যারান্টী দেয় যে উপাদানগুলি inোকানো হয়েছিল একই ক্রমে ফিরে আসবে।

তবে লিংকডহ্যাশসেট একটি বাস্তবায়ন, কোনও ইন্টারফেস নয়! যা প্রয়োজন তা হ'ল একটি ইনডেক্সডসেট (বা তালিকাসেট, বা অর্ডারসেট, বা ইউনিকলিস্ট) ইন্টারফেস! এটি প্রোগ্রামারকে এটি নির্দিষ্ট করার অনুমতি দেবে যে তার একটি নির্দিষ্ট ক্রমযুক্ত এবং নকল ছাড়াই এমন উপাদানগুলির সংকলন প্রয়োজন এবং তারপরে এটি কোনও প্রয়োগের সাথে ইনস্ট্যান্টিয়েট করবে (উদাহরণস্বরূপ হাইবারনেটের সরবরাহিত একটি বাস্তবায়ন)।

যেহেতু জেডি কে ওপেন সোর্স, সম্ভবত এই ইন্টারফেসটি শেষ পর্যন্ত জাভা in এর অন্তর্ভুক্ত হবে ...


3
যতদূর যায় দুর্দান্ত উত্তর, তবে এর মধ্যে আমরা কী করব?
এইচডিভ

এটা নিশ্চিত. আমি হাইবারনেটে ম্যানস্টোম্যানি ও অনোটোম্যানি ওআরএম হিসাবে তালিকা ব্যবহার করেছি। আমি তখন একটি সমস্যার মুখোমুখি হয়েছি (বা ত্রুটিযুক্ত) যখন 3 টি সম্পর্কিত সত্তার সাথে জড়িত বাম কোয়েরিতে, একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। আরও বিশদ জানতে এখানে দেখুন ( jroller.com/eyallupu/entry/… )। এই সমস্যাটি ঘুরে দেখার জন্য, ওআরএম ম্যাপিং সংগ্রহ হিসাবে সেট ব্যবহার করা প্রয়োজনীয়। তবে সত্যিই বলতে গেলে সেটটি প্রোগ্রামিং অ্যাক্সেসের জন্য সুবিধাজনক নয়, এবং যখন আপনার অর্ডার সংগ্রহের প্রয়োজন হয় তখনও। আমাদের সত্যিকারের যা দরকার তা হল "ইনডেক্সেটসেট" সোরিন পোস্টেলনিকু যেমন বলেছিলেন, সর্ট এবং
ইউনিক

2
অ্যাপাচি কমন্স সংগ্রহগুলিতে ListOrderedSetago বছর আগে ওপি প্রয়োজন যা ছিল (এবং আমার আজকের প্রয়োজন)।
পল

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

হ্যাঁ, তবে এই 3 টি প্রধান ত্রুটিগুলি বাদে এটি নিখুঁত! :) মধ্যে Retrospect আমি প্রশ্ন আমার মন্তব্য পোস্ট উচিত ছিল এবং আপনার উত্তর - আমি বন্ধ অস্থির What is needed is an IndexedSet (or ListSet, or OrderedSet, or UniqueList)...ও উপেক্ষা করা ...interface। এর জন্যে দুঃখিত!
পল

29

এমাইয়ার্সের উত্তরে উল্লেখ করা হয়নি এমন একটি পয়েন্ট কেবল যুক্ত করুন ।

যদি আমি জানতে পারি যে আমি প্রথম আইটেমটি চাই, আমি সেট.ইেট্রেটর () পরের () ব্যবহার করতে পারি, তবে অন্যথায় মনে হয় একটি নির্দিষ্ট সূচীতে কোনও আইটেম উদ্ধার করতে আমাকে অ্যারেতে কাস্ট করতে হবে?

কোনও সেট থেকে ডেটা পুনরুদ্ধারের উপযুক্ত উপায়গুলি কী কী? (একটি পুনরাবৃত্তকারী ব্যবহার ব্যতীত)

SortedSetইন্টারফেসের সাথে নিজেকেও পরিচিত করা উচিত (যার সর্বাধিক সাধারণ প্রয়োগ হচ্ছে TreeSet)।

একটি সাজানো সেট একটি সেট (অর্থাত্‍ উপাদানগুলি অনন্য) যা উপাদানগুলির প্রাকৃতিক ক্রম বা কিছু ব্যবহার করে অর্ডার করা হয় Comparator। আপনি সহজেই প্রথম এবং শেষ আইটেমগুলি first()এবং last()পদ্ধতিগুলি ব্যবহার করে অ্যাক্সেস করতে পারেন । এ SortedSetএকবারে একবারে কাজে আসে, যখন আপনার সংগ্রহ দুটি সদৃশ-মুক্ত এবং নির্দিষ্ট উপায়ে অর্ডার করা প্রয়োজন।

সম্পাদনা : আপনার যদি এমন একটি সেট প্রয়োজন হয় যার উপাদানগুলি সন্নিবেশ-ক্রমে (অনেকটা তালিকার মতো) রাখা থাকে তবে একবার দেখুন LinkedHashSet


আমি নিজে লিঙ্কডহ্যাশসেট পছন্দ করি। তবে হ্যাঁ, এটি উল্লেখ করা ভাল। +1 টি
মাইকেল ম্যাইইয়ার্স

ধন্যবাদ, আমি উত্তরটি কিছুটা টুইট করলাম। (মনে হচ্ছে লিঙ্কডহ্যাশসেটগুলির সাথে আমার ট্রিসেটের কিছু বিভ্রান্তি ছিল had)
জোনিক

25

কখন আপনার কোনও সেট ব্যবহার করা উচিত এবং কখন আপনার একটি তালিকা ব্যবহার করা উচিত এ ধরণের প্রশ্নটি বাড়ে। সাধারণত, পরামর্শ যায়:

  1. যদি আপনার অর্ডার করা ডেটা প্রয়োজন হয় তবে একটি তালিকা ব্যবহার করুন
  2. আপনার যদি অনন্য ডেটা প্রয়োজন হয় তবে একটি সেট ব্যবহার করুন
  3. আপনার যদি উভয়েরই প্রয়োজন হয় তবে যে কোনওটি ব্যবহার করুন: একটি সাজানোসেট (তুলনাকারী দ্বারা অর্ডার করা ডেটার জন্য) বা একটি অর্ডারসেট / ইউনিকলিস্ট (সন্নিবেশ দ্বারা অর্ডার করা ডেটার জন্য)। দুর্ভাগ্যক্রমে জাভা এপিআই-তে এখনও অর্ডারসেট / ইউনিকলিস্ট নেই।

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


2
আপনি যদি অনির্দিষ্ট না হন তবে সংগ্রহটি <T> বা এমনকি স্বচ্ছল <T> গ্রহণ করুন এবং একটি তালিকা হিসাবে আরম্ভ করুন।
আন্দ্রেয় পিটারসন

এটি একটি ব্যাগ বা মাল্টিসেট হবে। তবে জাভা তাদের সমর্থন করে না; তারা বলেছে আপনার কেবল সংগ্রহ <T> সরাসরি ব্যবহার করা উচিত।
যান্ত্রিক শামুক 15

৪. আপনার অ-অনন্য ডেটা প্রয়োজন, এবং অর্ডার সম্পর্কে চিন্তা করবেন না। আপনি একটি সেট ব্যবহার করতে পারবেন না। একটি তালিকা, ব্যাগ বা মাল্টিসেট কাজ করবে।
অ্যান্ড্রু গ্যাল্যাশ

17

আমি নিশ্চিত না যে কেউ এইভাবে বানান বানিয়েছে কিনা তবে আপনাকে নিম্নলিখিতটি বুঝতে হবে:

একটি সেটে কোনও "প্রথম" উপাদান নেই।

কারণ, অন্যরা যেমন বলেছে, সেটের কোনও অর্ডার নেই। একটি সেট একটি গাণিতিক ধারণা যা বিশেষত অর্ডার অন্তর্ভুক্ত করে না।

অবশ্যই, আপনার কম্পিউটার মেমরির অর্ডার নয় এমন স্টাফগুলির একটি তালিকা সত্যিই রাখতে পারে না। এটি কিছু অর্ডার আছে। অভ্যন্তরীণভাবে এটি একটি অ্যারে বা লিঙ্কযুক্ত তালিকা বা কিছু তবে আপনি এটি সত্যই জানেন না এবং এটির প্রথম উপাদান নেই doesn't "প্রথম" যে উপাদানটি বের হয় সে সুযোগটি সেভাবেই আসে এবং পরের বারের মতো নাও হতে পারে। এমনকি যদি আপনি কোনও নির্দিষ্ট প্রথম উপাদানটির "গ্যারান্টি" দেওয়ার পদক্ষেপ নিয়েছিলেন, তা এখনও সুযোগের সাথেই প্রকাশিত হচ্ছে, কারণ আপনি কেবলমাত্র সেটটির একটি নির্দিষ্ট প্রয়োগের জন্য এটি সঠিকভাবে অর্জন করার জন্য ঘটেছে; কোনও আলাদা বাস্তবায়ন আপনি যা করেছেন তার সাথে সেভাবে কাজ করবে না। এবং, বাস্তবে, আপনি যে বাস্তবায়নটি ব্যবহার করছেন সেই সাথে আপনি কী ভাবেন বলে আপনি জানেন না।

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


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

আমি মনে করি না যে তিনি এটি মিস করেছেন (সম্ভবত তিনি স্বরলিপিটি দিয়ে স্লোপি ছিলেন)। সে সেট থেকে প্রথম উপাদানটি চায় না, সে সেট থেকে একটি স্বেচ্ছাসেবী উপাদান চায়। আপনি তাকে একটি অবাধ উপাদান দিতে পারে যেহেতু Setহয় Iterable
এলাজার লাইবোভিচ

আপনি সূচক দ্বারা get (সূচক) সম্পর্কে কথা বলছেন। সমতা দ্বারা গেট (অবজেক্ট) সম্পর্কে কী?
কুমার মনীশ

10

মানক জাভা সংগ্রহগুলি থেকে কিছু ডেটা স্ট্রাকচার অনুপস্থিত।

ব্যাগ (যেমন সেট কিন্তু একাধিকবার উপাদান থাকতে পারে)

ইউনিকলিস্ট (আদেশযুক্ত তালিকায় প্রতিটি উপাদান কেবল একবারে থাকতে পারে)

এই ক্ষেত্রে আপনার একটি ইউনিক্লিস্টের প্রয়োজন হবে বলে মনে হচ্ছে

আপনার যদি নমনীয় ডেটা স্ট্রাকচারের প্রয়োজন হয় তবে আপনি গুগল সংগ্রহগুলিতে আগ্রহী হতে পারেন


1
গুভা কি "ইউনিকলিস্ট" সরবরাহ করে?
মাইক রাইল্যান্ডার

না, তবে আপনার কাছে java.util.LinkedHashSet থাকতে পারে যা একই বৈশিষ্ট্যযুক্ত।
Andreas পিটারসন

7

এটি সত্য, সেট সংগ্রহের সংজ্ঞা অনুসারে সেটে উপাদানগুলি অর্ডার করা হয় না। সুতরাং তারা কোনও সূচক দ্বারা অ্যাক্সেস করতে পারে না।

তবে কেন আমাদের কাছে একটি গেট (অবজেক্ট) পদ্ধতি নেই, সূচকটি প্যারামিটার হিসাবে সরবরাহ করে নয়, তবে একটি বস্তু যা আমরা খুঁজছি তার সমান? এইভাবে, আমরা সেটটির অভ্যন্তরে উপাদানটির ডেটা অ্যাক্সেস করতে পারি, কেবল সমান পদ্ধতিতে ব্যবহৃত বৈশিষ্ট্যগুলি জেনে।


7

আপনি যদি কোনও সেটে সূচি অনুসারে প্রচুর এলোমেলো অ্যাক্সেস করতে চলেছেন তবে আপনি এর উপাদানগুলির একটি অ্যারে ভিউ পেতে পারেন:

Object[] arrayView = mySet.toArray();
//do whatever you need with arrayView[i]

দুটি প্রধান ত্রুটি রয়েছে যদিও:

  1. এটি স্মৃতিশক্তির দক্ষ নয়, পুরো সেটটির জন্য একটি অ্যারে তৈরি করা দরকার।
  2. যদি সেটটি সংশোধন করা হয় তবে দৃশ্যটি অচল হয়ে যায়।

5

কারণ সেটটি কেবল স্বাতন্ত্র্যের গ্যারান্টি দেয় তবে অনুকূল অ্যাক্সেস বা ব্যবহারের নিদর্শন সম্পর্কে কিছুই বলে না। অর্থাত্, একটি সেট একটি তালিকা বা মানচিত্র হতে পারে, যার প্রত্যেকেরই পুনরুদ্ধারের বৈশিষ্ট্যগুলি খুব আলাদা।


5

আমি সেটটিতে একটি সংখ্যাসূচক সূচক ব্যবহার করার জন্য কেবলমাত্র কারণটিই পুনরাবৃত্তির জন্য হতে পারে। তার জন্য, ব্যবহার করুন

for(A a : set) { 
   visit(a); 
}

সত্য নয়, এলোমেলো উপাদান অ্যাক্সেস সম্পর্কে কী?
জেরেমি সালওয়েন

হা, হা। ভাল কথা :) তবে এটি অপব্যবহারের জন্য অত্যন্ত প্রবণতা হবে, আমি নিশ্চিত।
হুগো

3

আমি এমন পরিস্থিতিতে ছুঁড়েছি যেখানে আমি আসলে সূচকের মাধ্যমে অ্যাক্সেস সহ একটি সাজানো সেট চেয়েছিলাম (আমি অন্যান্য পোস্টারগুলির সাথে সম্মতি জানাই যে কোনও সূচকের সাথে একটি অরসোর্টড সেট অ্যাক্সেস করা কোনও অর্থবোধ করে না)। একটি উদাহরণ হবে এমন একটি গাছ যেখানে আমি চেয়েছিলাম যে বাচ্চাদের বাছাই করা এবং নকল বাচ্চাদের অনুমতি দেওয়া উচিত নয়।

সেগুলি প্রদর্শনের জন্য আমার সূচকের মাধ্যমে অ্যাক্সেসের প্রয়োজন ছিল এবং ডুপ্লিকেটগুলি দক্ষতার সাথে নির্মূল করার জন্য সেট বৈশিষ্ট্যগুলি কার্যকর হয়েছিল।

Java.util বা গুগল সংগ্রহগুলিতে উপযুক্ত সংগ্রহ খুঁজে পাচ্ছি না, আমি নিজে এটি প্রয়োগ করে সোজা পেয়েছি। মূল ধারণাটি হ'ল একটি সাজানো সেটটি মোড়ানো এবং সূচীর মাধ্যমে অ্যাক্সেসের প্রয়োজন হলে একটি তালিকা তৈরি করা (এবং সোর্টসেট পরিবর্তিত হলে তালিকাটি ভুলে যান)। এটি অবশ্যই কেবল দক্ষতার সাথে কাজ করে যখন মোড়কযুক্ত সাজ্টসেট পরিবর্তন করে এবং তালিকাটি অ্যাক্সেস করা সংগ্রহের আজীবন পৃথক হয়ে যায়। অন্যথায় এটি তালিকার মতো আচরণ করে যা প্রায়শই বাছাই করা হয়, অর্থাত্ খুব ধীর।

প্রচুর সংখ্যক শিশু সহ, এই সংগ্রহগুলি.সোর্টের মাধ্যমে আমি সাজানো রেখেছি এমন একটি তালিকার চেয়ে এই উন্নত সম্পাদন।


2

দয়া করে নোট করুন যে কেবলমাত্র 2 টি প্রাথমিক তথ্য কাঠামো সূচকের মাধ্যমে অ্যাক্সেস করা যেতে পারে।

  • অপারেশন O(1)অর্জনের জন্য অ্যারে ডেটা স্ট্রাকচার সময় জটিলতার সাথে সূচকের মাধ্যমে অ্যাক্সেস করা যায় get(int index)
  • লিংকডলিস্টের ডেটা স্ট্রাকচারটি সূচকের মাধ্যমেও অ্যাক্সেস করা যায়, তবে অপারেশন O(n)অর্জনের জন্য সময় জটিলতার সাথে get(int index)

জাভাতে অ্যারে ডেটা স্ট্রাকচার ArrayListব্যবহার করে প্রয়োগ করা হয় ।

যখন কোনও উপাত্ত বিদ্যমান এবং অ-বিদ্যমান উপাদান যুক্ত হয় তা দ্রুত সনাক্ত করার জন্য সাধারণত সেট ডেটা স্ট্রাকচারটি হ্যাশটবেল / হ্যাশম্যাপ বা ব্যালেন্সডট্রি ডেটা স্ট্রাকচারের মাধ্যমে প্রয়োগ করা যেতে পারে, সাধারণত একটি কার্যকরভাবে সেটO(1) সময় জটিলতার containsক্রিয়াকলাপ অর্জন করতে পারে । জাভাতে, সেটটিHashSet সর্বাধিক ব্যবহৃত কার্যকর বাস্তবায়ন , এটি এপিআই কল করে প্রয়োগ করা হয় এবং সংযুক্ত তালিকার ( অ্যারে এবং লিংকডলিস্টের সংমিশ্রণ ) পৃথক চেইন ব্যবহার করে প্রয়োগ করা হয়HashMapHashMap

যেহেতু সেটটি বিভিন্ন ডেটা স্ট্রাকচারের মাধ্যমে প্রয়োগ করা যেতে পারে, তাই এর কোনও get(int index)পদ্ধতি নেই ।


আঙ্গুলের গাছগুলি (হাস্কেলের Data.Sequence.lookupকার্যকারিতা দেখুন) সূচকের মাধ্যমে অ্যাক্সেসের অনুমতি দেয় ( মাঝের কাছাকাছি O(1)প্রান্তটি O(log n)আরও নিখুঁতভাবে O(min(log(k), log(n-k)))), বাইনারি গাছগুলিও করতে পারে (হাস্কেলের Data.Set.lookupIndexকাজ দেখুন)। সুতরাং আপনার প্রাথমিক বক্তব্য যে "দয়া করে নোট করুন কেবলমাত্র 2 টি প্রাথমিক তথ্য কাঠামো সূচকের মাধ্যমে অ্যাক্সেস করা যেতে পারে" সঠিক নয়।
সেমিকোলন

1

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

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

// আমি আশা করি সেট ইন্টারফেসটির যদিও গেম-এলোমেলো-উপাদান রয়েছে।


1

java.util.Setঅ-অর্ডারযুক্ত আইটেমগুলির সংগ্রহ। সেটটিতে একটি (ইনটেক্স ইনডেক্স) পাওয়া থাকলে এটি কোনও অর্থবোধ করে না, কারণ সেটের কোনও সূচি নেই এবং আপনি কেবল মানটি অনুমান করতে পারেন।

আপনি যদি সত্যিই এটি চান তবে সেট থেকে এলোমেলো উপাদান পাওয়ার জন্য একটি পদ্ধতি কোড করুন।


0

আপনি করতে পারেন new ArrayList<T>(set).get(index)


এটি সেটগুলির একটি তালিকা প্রদান করে এবং (সূচী) একটি সেট প্রদান করে। পরিবর্তে, আমি ব্যবহার করেছি: new ArrayList<T>(t).get(0) আমি মনে করি যে কোনও সূচক দ্বারা কোনও সেট থেকে কোনও নির্দিষ্ট উপাদান পাওয়ার ধারণাটির বৈধ বিরোধিতা রয়েছে। তবে এটি চমৎকার হবে যদি সেটের একটিমাত্র () সদস্য ফাংশন থাকে যা 1 মাপের সেটের জন্য, সেটের একমাত্র উপাদানটিতে সহজে অ্যাক্সেস সরবরাহ করেছিল। এটি পূর্বোক্ত new ArrayListবাfor (Foo foo : foos) { return foo; }
ডগ ম্যাসক্রপ

0

আপনি যদি সেটটি বাছাই করতে আপত্তি না করেন তবে আপনি সূচকযুক্ত-গাছ-মানচিত্র প্রকল্পটি একবার দেখে নিতে আগ্রহী হতে পারেন ।

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


0

সেটটি একটি ইন্টারফেস এবং এর বাস্তবায়ন শ্রেণীর কয়েকটি হ্যাশসেট, ট্রিসেট এবং লিংকডহ্যাশসেট। এটি মান সংরক্ষণের জন্য হুডের নীচে হ্যাশম্যাপ ব্যবহার করে। হ্যাশম্যাপ আদেশটি সংরক্ষণ করে না, তাই সূচকের দ্বারা মান পাওয়া সম্ভব নয়।

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

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

সমস্ত Setপ্রয়োগগুলি HashMapহুডের নীচে মান সংরক্ষণের জন্য ব্যবহার করছে আপনি কি সেই দাবির প্রমাণ দিতে পারেন TreeSet?
গ্রেইবার্ড

1
the keys in the HashMap will have the same constant value মধ্যে কী HashMapহবে ম্যাপ এক এবং একই অপরিবর্তনীয়Object
বৃদ্ধলোক


-3

একটি সেটে উপাদান পেতে, আমি নিম্নলিখিতটি ব্যবহার করি:

public T getElement(Set<T> set, T element) {
T result = null;
if (set instanceof TreeSet<?>) {
    T floor = ((TreeSet<T>) set).floor(element);
    if (floor != null && floor.equals(element))
    result = floor;
} else {
    boolean found = false;
    for (Iterator<T> it = set.iterator(); !found && it.hasNext();) {
    if (true) {
        T current = it.next();
        if (current.equals(element)) {
        result = current;
        found = true;
        }
    }
    }
}
return result;
}

ফাংশনটি প্রশ্নটির জন্য যা বলেছিল তা নয়। আমাদের সূচকের দরকার, মান নয়। আপনার ফাংশন যাইহোক কি করছেন? দেখে মনে হচ্ছে এটি কেবলমাত্র উপাদানটি প্রদান করে যদি এটি কোনও উপাদানের মধ্যে সমান হয়। এটি কী করে যা এতে () থাকে না?
জানুস ট্রয়লসন

Tসংজ্ঞায়িত কোথায় ? কেন if (true)?
কোয়ান্টাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.