জাভাতে কীভাবে একটি অনন্য তালিকা বজায় রাখা যায়?


104

জাভাতে কীভাবে অনন্য / স্বতন্ত্র অবজেক্টের (নকল নয়) একটি তালিকা তৈরি করবেন?

HashMap<String, Integer>কীটি ওভাররাইট হয়েছে তাই এই মুহূর্তে আমি এটি করতে ব্যবহার করছি এবং অতএব শেষে আমরা পেতে পারি HashMap.getKeySet()যা অনন্য হবে। তবে আমি নিশ্চিত যে মানটির অংশটি এখানে নষ্ট হওয়ায় এটি করার আরও ভাল উপায় হওয়া উচিত।

উত্তর:


164

আপনি একটি সেট প্রয়োগ ব্যবহার করতে পারেন :

জাভাডোকের কিছু তথ্য:

একটি সংগ্রহ যাতে কোনও সদৃশ উপাদান নেই । আরও আনুষ্ঠানিকভাবে, সেটগুলিতে e1 এবং e2 এর মতো E1 এবং e2 উপাদানগুলির কোনও জুড়ি থাকে না এবং সর্বাধিক একটি নাল উপাদান থাকে। এর নাম দ্বারা বোঝানো হিসাবে, এই ইন্টারফেস গাণিতিক সেট বিমূর্ততা মডেল।

দ্রষ্টব্য: যদি পরিবর্তনীয় বস্তুগুলি সেট উপাদান হিসাবে ব্যবহৃত হয় তবে দুর্দান্ত যত্ন নিতে হবে। কোনও বস্তুর মান এমনভাবে পরিবর্তিত হয় যা বস্তুটি সেটের একটি উপাদান থাকা অবস্থায় তুলনার সমানকে প্রভাবিত করে যদি সেটটির আচরণ নির্দিষ্ট করা হয় না। এই নিষেধাজ্ঞার একটি বিশেষ ক্ষেত্রে এটি যে কোনও সেটকে উপাদান হিসাবে ধারণ করা বৈধ নয় `

এগুলি বাস্তবায়ন:

  • HashSet

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

    যখন পুনরুক্তি করা HashSetহয় তখন উত্পাদিত উপাদানগুলির ক্রম নির্ধারিত হয়।

  • LinkedHashSet

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

    সুতরাং, উপরের কোডটির আউটপুট ...

     Set<Integer> linkedHashSet = new LinkedHashSet<>();
     linkedHashSet.add(3);
     linkedHashSet.add(1);
     linkedHashSet.add(2);
    
     for (int i : linkedHashSet) {
         System.out.println(i);
     }

    ... অবশ্যই হবে

    3
    1
    2
  • TreeSet

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

     Set<Integer> treeSet = new TreeSet<>();
     treeSet.add(3);
     treeSet.add(1);
     treeSet.add(2);
    
     for (int i : treeSet) {
         System.out.println(i);
     }

    ... এটি আউটপুট হবে:

    1
    2
    3

    (আপনি উপাদানটিকে আলাদা ক্রমে সাজিয়ে তৈরি করে Comparatorকোনও TreeSetকনস্ট্রাক্টরের কাছেও উদাহরণ দিয়ে যেতে পারেন))

    নোট করুন যে কোনও সেট দ্বারা রক্ষণাবেক্ষণ করা ক্রমটি (সুস্পষ্ট তুলনামূলক সরবরাহ করা হবে কিনা তা) এটি সেট ইন্টারফেসটি সঠিকভাবে প্রয়োগ করতে হলে সমান সাথে সামঞ্জস্যপূর্ণ হতে হবে। (সমতার সাথে সামঞ্জস্যের একটি সংক্ষিপ্ত সংজ্ঞা জন্য তুলনামূলক বা তুলনামূলক দেখুন)) এটি কারণ সমান ক্রিয়াকলাপের ক্ষেত্রে সেট ইন্টারফেসটি সংজ্ঞায়িত করা হয় তবে একটি ট্রিসেট উদাহরণটি তার তুলনাটো (বা তুলনা) পদ্ধতিটি ব্যবহার করে সমস্ত উপাদানকে তুলনা করে, তাই দুটি এই পদ্ধতির দ্বারা সমান হিসাবে বিবেচিত উপাদানগুলি, সেটটির দৃষ্টিকোণ থেকে সমান। কোনও সেট এর আচরণ সমানর সাথে সঙ্গতিপূর্ণ না হলেও এমনকি তার সংজ্ঞাটি সংজ্ঞায়িত করা হয়; এটি কেবল সেট ইন্টারফেসের সাধারণ চুক্তিটি মানতে ব্যর্থ।


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

1
পছন্দটি আপনার হ'ল ... হ্যাশসেট সর্বজনীন এবং দ্রুত, ট্রিসেট অর্ডার করা হয়েছে, লিংকডহ্যাশেট সন্নিবেশের আদেশ রাখে ...
ফ্রাঙ্ক

6
এটি কোনও তালিকা নয় ... সুতরাং সমস্ত লিস্ট ইন্টারফেসের পদ্ধতি উপলব্ধ নয়।
মার্কোল্পস

2
একটি সেট কোনও তালিকা নয়, আমি ও (1) সময়ে (এলোমেলো অ্যাক্সেস) সেটটিতে সূচি অনুসারে উপাদানগুলি দেখতে পাচ্ছি না।
উইলমল

13

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

আপনার যদি সত্যিই একটি তালিকার দরকার যেখানে কেবল একটি অনন্য বাধা রয়েছে, সেখানে অ্যাপাচি কমন ইউটিলস ক্লাস org.apache.commons.collections.list.SetUniqueList রয়েছে যা আপনাকে তালিকার ইন্টারফেস এবং অনন্য সীমাবদ্ধতা সরবরাহ করবে। মনে মনে, এটি তালিকার ইন্টারফেসটি যদিও ভেঙে দেয়। আপনি যদি সূচকে তালিকাতে সন্ধান করতে চান তবে আপনি এ থেকে আরও ভাল পারফরম্যান্স পাবেন। আপনি যদি সেট ইন্টারফেসের সাথে ডিল করতে পারেন, এবং আপনার কাছে একটি ছোট ডেটা সেট রয়েছে, তবে লিংকডহ্যাশসেটটি যেতে ভাল উপায় হতে পারে। এটি কেবল আপনার সফ্টওয়্যারটির নকশা এবং অভিপ্রায় নির্ভর করে।

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


3
এটি প্রশ্নের উত্তর দেয় না। কোনও লেখকের কাছ থেকে সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন - আপনি সর্বদা আপনার নিজের পোস্টে মন্তব্য করতে পারেন, এবং আপনার যথেষ্ট খ্যাতি অর্জনের পরে আপনি যে কোনও পোস্টে মন্তব্য করতে সক্ষম হবেন ।
জাচ স্যুসিয়ার

1
এটি আসলে একটি উত্তর সরবরাহ করে। যদি সে কেবল একটি তালিকা চায় যা সেটের মতো কাজ করে, org.apache.commons.collections.list.SetUniqueList ব্যবহার করে তবে প্রোগ্রামার হিসাবে তার / আমাদের উচিত তার চেয়ে বেশি যত্নবান হওয়া এবং সমস্যাটি নিয়ে আরও চিন্তা করা উচিত। এটি যদি আমার উত্তরটিকে আরও ভাল করে তোলে, "জাভাতে কীভাবে একটি অনন্য তালিকা তৈরি করবেন?" অনন্য তালিকা তালিকাভুক্ত করুন = নতুন সেটআপলিক তালিকা ();, এভাবেই ....
পল

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

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

8

new HashSet<String> একটি উদাহরণ ব্যবহার করুন :

import java.util.HashSet;
import java.util.Set;

public class MainClass {
  public static void main(String args[]) {
    String[] name1 = { "Amy", "Jose", "Jeremy", "Alice", "Patrick" };

    String[] name2 = { "Alan", "Amy", "Jeremy", "Helen", "Alexi" };

    String[] name3 = { "Adel", "Aaron", "Amy", "James", "Alice" };

    Set<String> letter = new HashSet<String>();

    for (int i = 0; i < name1.length; i++)
      letter.add(name1[i]);

    for (int j = 0; j < name2.length; j++)
      letter.add(name2[j]);

    for (int k = 0; k < name3.length; k++)
      letter.add(name3[k]);

    System.out.println(letter.size() + " letters must be sent to: " + letter);

  }
}

2
কেবলমাত্র উপরের প্রোগ্রামটির পুস্তক যোগ করা -> ১১ টি চিঠি অবশ্যই পাঠাতে হবে: [হারুন, অ্যালিস, জেমস, অ্যাডেল, জোসে, জেরেমি, অ্যামি, অ্যালান, প্যাট্রিক, হেলেন, আলেক্সি]
আম্মাদ

4

আপনি HashSet<String>অনন্য বস্তুর সংগ্রহ বজায় রাখতে কেবল একটি ব্যবহার করতে পারেন । যদি Integerআপনার মানচিত্রে মানগুলি গুরুত্বপূর্ণ হয়, তবে আপনি পরিবর্তে containsKeyমানচিত্রের পদ্ধতিটি ব্যবহার করতে পারেন আপনার কী ইতিমধ্যে মানচিত্রে রয়েছে কিনা তা পরীক্ষা করতে।



2

আমি জানি না এটি কতটা দক্ষ, তবে একটি সাধারণ প্রসঙ্গে আমার পক্ষে কাজ করেছেন।

List<int> uniqueNumbers = new ArrayList<>();

   public void AddNumberToList(int num)
    {
        if(!uniqueNumbers .contains(num)) {
            uniqueNumbers .add(num);
        }
    }

1

আপনি java.util.Set<E>ইন্টারফেসের প্রয়োগকারী ক্লাসের মধ্যে একটি ব্যবহার করতে পারেন যেমন java.util.HashSet<String> সংগ্রহ শ্রেণি।

একটি সংগ্রহ যাতে কোনও সদৃশ উপাদান নেই। আরও আনুষ্ঠানিকভাবে, সেটগুলিতে e1 এবং e2 এর মতো E1 এবং e2 উপাদানগুলির কোনও জুড়ি থাকে না এবং সর্বাধিক একটি নাল উপাদান থাকে। এর নাম দ্বারা বোঝানো হিসাবে, এই ইন্টারফেস গাণিতিক সেট বিমূর্ততা মডেল।

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