জাভাতে কেন কোনও সাজানো তালিকা নেই?


502

জাভাতে SortedSetএবং SortedMapইন্টারফেস রয়েছে। উভয়ই জাভা সংগ্রহের কাঠামোর অন্তর্ভুক্ত এবং উপাদানগুলি অ্যাক্সেস করার জন্য একটি সজ্জিত উপায় সরবরাহ করে।

যাইহোক, আমার বোঝার SortedListমধ্যে জাভা নেই। আপনি java.util.Collections.sort()একটি তালিকা বাছাই করতে ব্যবহার করতে পারেন।

কোনও ধারণা কেন এটি এমনভাবে ডিজাইন করা হয়েছে?


3
কি stackoverflow.com/questions/416266/sorted-collection-in-java আপনাকে সাহায্য করবে?
নিকো হাজেস

6
সুতরাং তালিকার মাঝখানে কোনও উপাদান whenোকানোর সময় আপনার প্রত্যাশিত ফলাফলটি কী?
বেটসেস

4
@ বেস্টেস জাভা.ইটিল.লাইস্ট ইন্টারফেস প্রয়োগ করে না এমন একটি সোর্টার্ডলিস্ট ক্লাস করা পুরোপুরি সম্ভব হবে। অনুরোধ কার্যকারিতা সমর্থন করে এমন কোনও ডেটা স্ট্রাকচার কেন নেই তা তদন্ত হিসাবে প্রশ্নটি পড়ুন। নামকরণের মতো তুচ্ছ বিবরণে বিভ্রান্ত হবেন না।
অ্যালাদারথ

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

3
"কেন" প্রশ্নের উত্তর না দিয়ে, তবে ট্রিসেটের জন্য সবচেয়ে সহজ কাজটি হ'ল কোনও তুলনামূলক ব্যবহার করা যা কখনই শূন্য হয় না, যেমন int diff = this.score - that.score; return (diff == 0) ? 1 : diff; এটি একটি গন্ধযুক্ত হ্যাক আমি কোনও তুলনামূলক প্রয়োগের পরিবর্তে বেনামে নির্মাণকারী যুক্তি হিসাবে এটি সরবরাহ করব।
ইরকাম

উত্তর:


682

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

আমি ব্যক্তিগতভাবে এটি যেমন দেখছি ততই আমি কার্যকরতার ক্রমে উপায়গুলি অর্ডার করব :

1. ব্যবহার বিবেচনা করুন SetBag পরিবর্তে বা সংগ্রহ

দ্রষ্টব্য: আমি এই বিকল্পটি শীর্ষে রেখেছি কারণ এটি আপনি সাধারণত যেভাবেই করতে চান।

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

তদ্ব্যতীত যদি আপনি নিশ্চিত হন যে নকল উপাদানগুলি সম্পর্কে আপনার (বা) থাকা উচিত না তবে আপনি TreeSet<T>পরিবর্তে এটি ব্যবহার করতে পারেন । এটি প্রয়োগ করে SortedSetএবং NavigableSetইন্টারফেসগুলি কার্যকর করে যেমন আপনি সম্ভবত কোনও তালিকা থেকে প্রত্যাশা করেছেন:

TreeSet<String> set = new TreeSet<String>();
set.add("lol");
set.add("cat");
// automatically sorts natural order when adding

for (String s : set) {
    System.out.println(s);
}
// Prints out "cat" and "lol"

যদি আপনি প্রাকৃতিক ক্রমটি না চান তবে আপনি কনস্ট্রাক্টর প্যারামিটার ব্যবহার করতে পারেন যা একটি takes Comparator<T>

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

2. সাথে আপনার তালিকা বাছাই Collections.sort()

উপরে উল্লিখিত হিসাবে, বাছাই List s এর তথ্য কাঠামোর ম্যানিপুলেশন। সুতরাং এমন পরিস্থিতিতে যেখানে আপনার "সত্যের একটি উত্স" দরকার যা বিভিন্ন উপায়ে সাজানো হবে তারপরে ম্যানুয়ালি বাছাই করা হ'ল উপায়।

আপনি java.util.Collections.sort()পদ্ধতিটি দিয়ে আপনার তালিকাটি বাছাই করতে পারেন । কীভাবে একটি কোড নমুনা এখানে:

List<String> strings = new ArrayList<String>()
strings.add("lol");
strings.add("cat");

Collections.sort(strings);
for (String s : strings) {
    System.out.println(s);
}
// Prints out "cat" and "lol"

তুলনামূলক ব্যবহার

এক স্পষ্ট সুবিধা যা আপনি ব্যবহার করতে পারে Comparatorমধ্যে sortপদ্ধতি। জাভা কিছু বাস্তবায়ন Comparatorযেমন যেমন Collatorলোকাল সংবেদনশীল বাছাইয়ের স্ট্রিংয়ের জন্য কার্যকর provides এখানে একটি উদাহরণ:

Collator usCollator = Collator.getInstance(Locale.US);
usCollator.setStrength(Collator.PRIMARY); // ignores casing

Collections.sort(strings, usCollator);

সমবর্তী পরিবেশে বাছাই করা

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

List<string> sorted = Ordering.natural().sortedCopy(strings);

3. সাথে আপনার তালিকা মোড়ানো java.util.PriorityQueue

জাভাতে কোন সাজানো তালিকা না থাকলেও সেখানে বাছাই করা সারি রয়েছে যা সম্ভবত আপনার জন্য ঠিক কাজ করবে। এটা java.util.PriorityQueueক্লাস।

নিকো হায়েস একটি সম্পর্কিত প্রশ্নের সাথে মন্তব্যে লিঙ্ক করেছেন যা এর উত্তরও দেয়।

বাছাই করা সংকলনে আপনি সম্ভবত অভ্যন্তরীণ ডেটা স্ট্রাকচারটি হেরফের করতে চান না যে কারণে অগ্রাধিকারকুই তালিকা ইন্টারফেসটি কার্যকর করে না (কারণ এটি আপনাকে এর উপাদানগুলিতে সরাসরি অ্যাক্সেস দেয়)।

পুনরাবৃত্তকারী উপর PriorityQueueগুহা

PriorityQueueবর্গ কার্যকরী Iterable<E>এবং Collection<E>ইন্টারফেস তাই এটি স্বাভাবিক হিসাবে iterated করা যেতে পারে। তবে, সাজানো ক্রমে পুনরুক্তিকারী উপাদানগুলি ফেরতের গ্যারান্টিযুক্ত নয়। পরিবর্তে (মন্তব্যগুলিতে অ্যালাদারথ যেমন উল্লেখ করেছেন) poll()খালি হওয়া পর্যন্ত আপনার কাতারে থাকা দরকার ।

নোট করুন যে আপনি যে কোনও সংগ্রহ গ্রহণকারী কনস্ট্রাক্টরের মাধ্যমে একটি তালিকাটিকে অগ্রাধিকারের সারিতে রূপান্তর করতে পারেন :

List<String> strings = new ArrayList<String>()
strings.add("lol");
strings.add("cat");

PriorityQueue<String> sortedStrings = new PriorityQueue(strings);
while(!sortedStrings.isEmpty()) {
    System.out.println(sortedStrings.poll());
}
// Prints out "cat" and "lol"

৪. নিজের SortedListক্লাস লিখুন

দ্রষ্টব্য: আপনার এটি করা উচিত নয়।

আপনি নিজের তালিকা ক্লাসটি লিখতে পারেন যা প্রতিবার নতুন উপাদান যুক্ত করলে তা সাজায়। এটি আপনার প্রয়োগের উপর নির্ভর করে ভারী গণনা ভারী পেতে পারে এবং এটি দুটি অর্থের কারণেই আপনি ব্যায়াম হিসাবে না করতে চাইলে তা অর্থহীন :

  1. এটি List<E>ইন্টারফেসের সাথে চুক্তি ভঙ্গ করে কারণadd পদ্ধতিগুলি নিশ্চিত করা উচিত যে ব্যবহারকারী সূচকটিতে উপাদানটি থাকবে।
  2. চাকা পুনরুদ্ধার কেন? আপনার উপরের প্রথম পয়েন্টে উল্লিখিত পরিবর্তে আপনার ট্রিসেট বা মাল্টিসেটগুলি ব্যবহার করা উচিত।

তবে আপনি যদি অনুশীলন হিসাবে এটি করতে চান তবে এখানে শুরু করার জন্য একটি কোড নমুনা, এটি AbstractListবিমূর্ত শ্রেণি ব্যবহার করে :

public class SortedList<E> extends AbstractList<E> {

    private ArrayList<E> internalList = new ArrayList<E>();

    // Note that add(E e) in AbstractList is calling this one
    @Override 
    public void add(int position, E e) {
        internalList.add(e);
        Collections.sort(internalList, null);
    }

    @Override
    public E get(int i) {
        return internalList.get(i);
    }

    @Override
    public int size() {
        return internalList.size();
    }

}

মনে রাখবেন যে আপনি যদি প্রয়োজনীয় পদ্ধতিগুলি ওভাররাইড না করে থাকেন তবে ডিফল্ট প্রয়োগগুলি গুলি AbstractListছুঁড়ে দেবে UnsupportedOperationException


12
+1 টি। ইমো, এটি শীর্ষে দেওয়া উত্তরের চেয়ে আরও গঠনমূলক। এটি যদিও দুটি ছোট ছোট ডাউনসাইড সহ আসে। অগ্রাধিকারের কিউ এলোমেলো অ্যাক্সেস সমর্থন করে না। আপনি পিক (এলিমেন্টইন্ডেক্স) করতে পারবেন না। সুতরাং আপনি যেমন করতে পারবেন না Integer maxVal = prioQueue.peek(prioQueue.size() - 1);। দ্বিতীয়ত আপনি যদি অগ্রাধিকারের কিউইউকে কেবল বাছাই করা তালিকা হিসাবে ব্যবহার করতে চান তবে কোডটিতে এটি দেখার PriorityQueueচেয়ে কম স্বজ্ঞাত মনে হবে SortedList, যদি এই জাতীয় ডেটা কাঠামো বিদ্যমান থাকে।
অ্যালাদারথ

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

1
হুম ... দেখে মনে হচ্ছে তুমি ঠিক আলেডারথ। প্রত্যাশিত ক্রমে উপাদানগুলি পেতে আপনি অগ্রাধিকারের কিউটারের পুনরায় ব্যবহার করতে পারবেন না। দেখে মনে হচ্ছে আমার উত্তরটি সম্পাদনা করতে হবে।
স্পোইক

7
অগ্রাধিকারের সারিটি কেবল একটি গাদা, আপনি কেবল শীর্ষে অ্যাক্সেস করতে পারবেন, তবে এটি প্রশ্নের উত্তরের সাথে সম্পর্কিত নয়।
4'12

1
এছাড়াও লক্ষণীয় যে Collections.sort()এমনকি এমনকি আপনি একটি Comparatorবস্তু ব্যবহার করে বাছাই করতে ব্যবহৃত তুলনা ফাংশন সংজ্ঞায়িত করতে দেয় ।
মাইক 'পোম্যাক্স' কামারম্যানস

71

কারণ একটি তালিকার ধারণাটি স্বয়ংক্রিয়ভাবে সাজানো সংগ্রহের ধারণার সাথে সঙ্গতিপূর্ণ নয়। একটি তালিকার বিন্দু হ'ল list.add(7, elem)কল করার পরে একটি কল list.get(7)ফিরে আসবে elem। একটি স্বয়ংক্রিয় বাছাই করা তালিকা সহ, উপাদানটি একটি স্বেচ্ছাসেবী অবস্থানে শেষ হতে পারে।


26

যেহেতু সমস্ত তালিকাগুলি আইটেমগুলি যুক্ত করার আদেশ অনুসারে ইতিমধ্যে "সাজানো" হয়েছে (FIFO ক্রম), আপনি তাদের ব্যবহার করে উপাদানগুলির প্রাকৃতিক ক্রম সহ আরও একটি আদেশ দিয়ে "রিসর্ট" করতে পারেন java.util.Collections.sort()

সম্পাদনা করুন:

তথ্য স্ট্রাকচার হিসাবে তালিকা আকর্ষণীয় কি ভিত্তিতে হয় আইটেম whereোকানো হয় যেখানে ক্রম হয়।

সেটগুলিতে সেই তথ্য নেই।

আপনি যদি সময় যুক্ত করে অর্ডার করতে চান তবে ব্যবহার করুন List। আপনি যদি অন্যান্য মানদণ্ডে অর্ডার করতে চান তবে ব্যবহার করুন SortedSet


22
সেটটি সদৃশগুলিকে অনুমতি দেয় না
4'12

10
আমি মনে করি না এটি খুব ভাল উত্তর। অবশ্যই, জাভা এপিআই-র তালিকাগুলিতে আইটেমগুলি কখন / কীভাবে সন্নিবেশ করা হয়েছিল তার দ্বারা একটি নির্দিষ্ট ক্রম নির্ধারিত হয়। যাইহোক, তালিকার অস্তিত্ব এমনভাবে অর্ডার করা হয়েছে যা সন্নিবেশ পদ্ধতিতে / সময়ের উপর নির্ভর করে যাতে অন্যান্য উপাত্ত কাঠামো যাতে অর্ডার অন্য কোনও উপায়ে নির্ধারিত হয় (যেমনঃ তুলনাকারীর দ্বারা) নির্ধারিত হয় তা প্রতিরোধ করে না। মূলত, ওপি জিজ্ঞাসা করছে কেন সোর্টারেটসেটের সমতুল্য কোনও ডেটা স্ট্রাকচার নেই কেন এই ব্যতিক্রমের সাথে ডেটা স্ট্রাকচারটি সমান উপাদানগুলির একাধিক উপস্থিতির জন্য অনুমতি দেয়।
Alderath

5
সুতরাং আমার ফলোআপ প্রশ্নটি হ'ল : " কেন এমন কোনও ডেটা স্ট্রাকচার নেই যা একটি সাজ্টসেটের মতো কাজ করে তবে এতে একাধিক সমান উপাদান থাকতে পারে? " (এবং দয়া করে উত্তর দিন না " কারণ
সেটে

@Alderath: দেখুন stackoverflow.com/questions/416266/sorted-collection-in-java । সংক্ষেপে: পেয়ারার ট্রি মাল্টিটসেট ব্যবহার করুন
জানুস

4
তালিকাগুলি "সাজানো" হয় না, এমনকি যদি আপনি "সাজানো" ডাবল উদ্ধৃতিতে রেখে দেন। তাদের অর্ডার করা হয়।
Koray Tugay

20

সেট এবং মানচিত্র অ-লিনিয়ার ডেটা কাঠামো। তালিকাটি লিনিয়ার ডেটা স্ট্রাকচার।

এখানে চিত্র বর্ণনা লিখুন


ট্রি ডেটা স্ট্রাকচার SortedSetএবং SortedMapইন্টারফেস প্রয়োগ করে TreeSetএবং TreeMapযথাক্রমে ব্যবহৃত রেড-ব্ল্যাক ট্রি প্রয়োগকরণ অ্যালগরিদম ব্যবহার করে। সুতরাং এটি নিশ্চিত করে যে কোনও নকল আইটেম নেই (বা ক্ষেত্রে কীগুলি Map)।

  • List ইতিমধ্যে একটি আদেশযুক্ত সংগ্রহ এবং সূচক-ভিত্তিক ডেটা কাঠামো বজায় রেখেছে, গাছগুলি কোনও সূচক-ভিত্তিক ডেটা স্ট্রাকচার নয়।
  • Tree সংজ্ঞা অনুসারে সদৃশ থাকতে পারে না।
  • ইন Listআমরা সদৃশ থাকতে পারে, তাই কিছু নেই TreeList(অর্থাত কোন SortedList)।
  • তালিকা সন্নিবেশ ক্রমে উপাদান বজায় রাখে। সুতরাং আমরা যদি তালিকাটি ব্যবহার করতে হয় তা বাছাই করতে চাই java.util.Collections.sort()। এটি এর উপাদানগুলির প্রাকৃতিক ক্রম অনুসারে সুনির্দিষ্ট তালিকাটিকে আরোহণের ক্রম অনুসারে বাছাই করে।

14

JavaFX SortedList

যদিও এটি কিছুক্ষণ সময় নিয়েছে, জাভা 8 এর বাছাই হয়েছে Listhttp://docs.oracle.com/javase/8/javafx/api/javafx/collections/transformation/SortedList.html

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

আপডেট: নোট করুন যে জাভা 11 এর সাথে জাভাএফএক্স টুলকিটটি জেডিকে বাইরে চলে গেছে এবং এখন এটি একটি পৃথক গ্রন্থাগার is জাভাএফএক্স 11 ডাউনলোডযোগ্য এসডিকে বা মাভেনসেন্ট্রাল থেকে উপলভ্য। Https://openjfx.io দেখুন


2
দুর্ভাগ্যক্রমে, এই সাজানো তালিকাটি সাধারণ তালিকার মতো কাজ করে না - উদাহরণস্বরূপ, এটির কোনও ডিফল্ট নির্মাতা নেই (আপনাকে এটি একটি পর্যবেক্ষণযোগ্য তালিকার সাহায্যে নির্মাণ করতে হবে, যার অর্থ যাই হোক না কেন ...)
এরেল সেগাল-হালেভি

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

1
@ কোবারা.সিএইচ, হ্যাঁ, এটি সত্য। আরও পারফরম্যান্ট সাজানো তালিকাটি সম্ভবত ট্রিআম্যাপের চারপাশে একটি পাতলা মোড়ক হতে পারে, যেখানে কীটির অনুলিপি গণনা করতে একটি পূর্ণসংখ্যা ব্যবহৃত হয়। আপনি তুলনামূলক সাথে একটি ট্রিসেটও ব্যবহার করতে পারেন যা কখনই 0 ফেরত না
সোপালমার

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

10

যে কোনও নতুন আগতদের জন্য, ২০১৫ সালের এপ্রিল পর্যন্ত, অ্যান্ড্রয়েডের এখন সমর্থন লাইব্রেরিতে একটি সোর্টডলিস্ট ক্লাস রয়েছে, যা বিশেষভাবে কাজ করার জন্য ডিজাইন করা হয়েছে RecyclerView। এটি সম্পর্কে ব্লগ পোস্ট এখানে ।


1
লক্ষণীয় যে এই মন্তব্যের সময় অ্যান্ড্রয়েডস সোর্টার্ডলিস্টে রিসাইক্লারভিউয়ের সাথে আইটেমমেভড () কার্যকারিতাটির জন্য সমর্থন নেই। আমার নিজের সোর্টার্ডলিস্ট যা কম দক্ষ তা লেখার বিষয়টি সীমাবদ্ধতাগুলি অতিক্রম করার জন্য আমাকে যা করতে হয়েছিল।
ম্যাথু

4

আরেকটি বিষয় হ'ল sertোকানো অপারেশনের সময় জটিলতা। একটি তালিকা সন্নিবেশ করানোর জন্য, কেউ O (1) এর জটিলতা আশা করে। বাছাই করা তালিকার সাথে এটির গ্যারান্টি দেওয়া যায়নি।

এবং সবচেয়ে গুরুত্বপূর্ণ বিষয় হ'ল তালিকাগুলি তাদের উপাদানগুলি সম্পর্কে কিছুই ধরে নেয় না। উদাহরণস্বরূপ, আপনি এমন জিনিসগুলির তালিকা তৈরি করতে পারেন যা বাস্তবায়ন করে না equalsবা compare


আপনার কাছে ডাব্লু / ও (লগইন) সন্নিবেশ / মুছুন / সন্ধান করুন / রয়েছে তবে ডাব্লু / গেট (ইনট) নেই list
4'12

3
শেষ পয়েন্টটি আসলে একটি ভাল ব্যাখ্যা নয়। আপনি এমন SortedSetকিছু জিনিস তৈরি করতে পারেন যা কার্যকর করে না Comparableএই ট্রিসেট নির্মাতা দেখুন ।
আলেদারথ

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

তালিকাগুলি ও (1) সন্নিবেশের গ্যারান্টি দেয় না , তারা ও (1) অ্যাক্সেসের গ্যারান্টি দেয়bigocheatsheet.com
ম্যাট কুইগলে

1
আপনি ঠিক আছেন! আমি আমার মন্তব্য আপডেট করতে পারছি না, তবে জাভা Listইন্টারফেস এর পদ্ধতিতে কোনও কার্যকারিতা সংক্রান্ত বিশদকরণের গ্যারান্টি দেয় না।
ম্যাট কুইগলি

3

এর মতো এটিকে সম্বন্ধে চিন্তা করুন: Listইন্টারফেস পদ্ধতি আছে add(int index, E element), set(int index, E element)। চুক্তিটি হ'ল একবার আপনি এক্স পজিশনে কোনও উপাদান যুক্ত করলে আপনি এটি সেখানে খুঁজে পাবেন যদি না আপনি এর আগে উপাদানগুলি যুক্ত বা অপসারণ না করেন।

যদি কোনও তালিকা বাস্তবায়ন সূচকের উপর ভিত্তি করে অন্য কোনও ক্রমে উপাদানগুলি সঞ্চয় করে রাখে তবে উপরের তালিকা পদ্ধতির কোনও অর্থ হবে না।


2

তালিকার এপিআই-এর প্রথম লাইনটি বলে যে এটি একটি অর্ডার করা সংগ্রহ (ক্রম হিসাবেও পরিচিত)। আপনি যদি তালিকাটি সাজান আপনি অর্ডার বজায় রাখতে পারবেন না, তাই জাভাতে কোনও ট্রিলিস্ট নেই।
যেমন এপিআই বলেছে যে জাভা তালিকাটি সিকোয়েন্স থেকে অনুপ্রাণিত হয়েছে এবং সিকোয়েন্স বৈশিষ্ট্যগুলি দেখুন http://en.wikedia.org/wiki/Sequence_(mathematics )

এর অর্থ এই নয় যে আপনি তালিকাটি বাছাই করতে পারবেন না, তবে জাভা তাঁর সংজ্ঞায় কঠোর এবং তালিকাগুলির ডিফল্ট অনুসারে বাছাই করা সংস্করণ সরবরাহ করবেন না।



2

আপনি যদি উপাদানগুলিকে বাছাই করার কোনও উপায় সন্ধান করছেন তবে দক্ষতার সাথে সূচকের মাধ্যমে সেগুলি অ্যাক্সেস করতে সক্ষম হবেন, আপনি নিম্নলিখিতটি করতে পারেন:

  1. সঞ্চয়ের জন্য এলোমেলো অ্যাক্সেস তালিকা ব্যবহার করুন (উদাঃ ArrayList)
  2. এটি সর্বদা বাছাই করা হয়েছে তা নিশ্চিত করুন

তারপরে কোনও উপাদান যুক্ত বা সরাতে আপনি Collections.binarySearchসন্নিবেশ / অপসারণ সূচকটি পেতে ব্যবহার করতে পারেন । যেহেতু আপনার তালিকাটি এলোমেলো অ্যাক্সেস প্রয়োগ করে, আপনি নির্ধারিত সূচকের সাহায্যে তালিকাটি দক্ষতার সাথে সংশোধন করতে পারেন।

উদাহরণ:

/**
 * @deprecated
 *      Only for demonstration purposes. Implementation is incomplete and does not 
 *      handle invalid arguments.
 */
@Deprecated
public class SortingList<E extends Comparable<E>> {
    private ArrayList<E> delegate;

    public SortingList() {
        delegate = new ArrayList<>();
    }

    public void add(E e) {
        int insertionIndex = Collections.binarySearch(delegate, e);

        // < 0 if element is not in the list, see Collections.binarySearch
        if (insertionIndex < 0) {
            insertionIndex = -(insertionIndex + 1);
        }
        else {
            // Insertion index is index of existing element, to add new element 
            // behind it increase index
            insertionIndex++;
        }

        delegate.add(insertionIndex, e);
    }

    public void remove(E e) {
        int index = Collections.binarySearch(delegate, e);
        delegate.remove(index);
    }

    public E get(int index) {
        return delegate.get(index);
    }
}

1

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

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