কিভাবে একটি হ্যাশসেট বাছাই?


106

তালিকার জন্য, আমরা Collections.sort(List)পদ্ধতিটি ব্যবহার করি । যদি আমরা একটি বাছাই করতে চান HashSet?


20
HashSetএকটি আনর্ডারড সংগ্রহ।
অ্যালেক্সিস সি

2
আপনি পারবেন না, যেহেতু Setকারও কাছে এলোমেলো অ্যাক্সেসের পদ্ধতি নেই (যেমন .get()একটি প্রদত্ত সূচকে একটি উপাদান), যা মূলত সাজানোর অ্যালগরিদমের জন্য প্রয়োজনীয়;)
fge

3
আপনি প্রথমে এটিকে একটি তালিকায় রূপান্তর করতে পারেন তবে আপনার যদি সাজানোর দরকার হয়
ডেমোঙ্গোলেম

আপনি যেহেতু HashSetকোনওর একটি সংজ্ঞায়িত অর্ডার না পেয়ে পারেন না। আপনার প্রশ্নটি পদগুলিতে একটি বৈপরীত্যের সূচনা করে।
লার্নের মারকুইস

1
একটি TreeSet ব্যবহার এবং যদি আপনি উৎস নিয়ন্ত্রণ করতে পারে না রূপান্তর একটি ব্যবহার এখানে দেখতে stackoverflow.com/a/52987487/5153955
Tenflex

উত্তর:


114

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

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

Set<?> yourHashSet = new HashSet<>();

...

List<?> sortedList = new ArrayList<>(yourHashSet);
Collections.sort(sortedList);

1
এছাড়াও, আপনি যদি স্ট্রিংয়ের কোনও সংগ্রহ ব্যবহার করেন, তবেList<String> sortedList = new ArrayList<String>(yourHashSet);
উইসবাকী

65

আপনার সমস্ত অবজেক্টগুলিতে যুক্ত করুন TreeSet, আপনি একটি সাজানো সেট পাবেন। নীচে একটি কাঁচা উদাহরণ দেওয়া আছে।

HashSet myHashSet = new HashSet();
myHashSet.add(1);
myHashSet.add(23);
myHashSet.add(45);
myHashSet.add(12);

TreeSet myTreeSet = new TreeSet();
myTreeSet.addAll(myHashSet);
System.out.println(myTreeSet); // Prints [1, 12, 23, 45]

2
ব্যবহার করে TreeSet myTreeSet = new TreeSet(myHashSet);আপনি আবার ট্রিসেটে সমস্ত উপাদান যুক্ত এড়াতে পারবেন।
মৌনিকা

17

পরিবর্তে আপনি একটি ট্রিসেট ব্যবহার করতে পারেন ।


1
কেবল উপাদানগুলিকে রেখে দেওয়া কোনও অভ্যন্তরের সাথে কোনও ক্রম বাছাইয়ের নমনীয়তা দেয়। উপরের সমাধানটি করে।
জেস

15

জাভা 8 এটি বাছাই করার উপায় হবে:

fooHashSet.stream()
  .sorted(Comparator.comparing(Foo::getSize)) //comparator - how you want to sort it
  .collect(Collectors.toList()); //collector - what you want to collect it to

* Foo::getSizeএটি আপনার আইটেমের হ্যাশসেটটিকে প্রাকৃতিক আকার অনুসারে বাছাই করার উদাহরণ।

* Collectors.toList()একটি তালিকা বাছাইয়ের ফলাফল সংগ্রহ করতে যাচ্ছে যা আপনাকে এটি ক্যাপচার করতে হবেList<Foo> sortedListOfFoo =


আপনি কি দয়া করে একটি নির্দিষ্ট ক্রমে সাজানোর জন্য যুক্তি যুক্ত করতে পারেন?
জেস

@ জেস আমি জানি না যে আপনার জন্য নির্দিষ্ট অর্ডারটি কী জেস, আপনি তুলনামূলকটি ব্যবহার করার ইচ্ছা অনুসারে এটি বাছাই করতে পারেন।
LazerBanana

আমি বোঝাতে চাইছি, কীভাবে আরোহণ বা বর্ধন সংজ্ঞা দেওয়া যায়
জেস

14

java.util.TreeSetআসল বস্তু হিসাবে ব্যবহার করুন । আপনি যখন এই সংগ্রহটি নিয়ে পুনরাবৃত্তি করেন তখন মানগুলি একটি সংজ্ঞায়িত ক্রমে ফিরে আসে।

আপনি যদি ব্যবহার করেন java.util.HashSetতবে অর্ডারটি অভ্যন্তরীণ হ্যাশ ফাংশনের উপর নির্ভর করে যা প্রায় অবশ্যই লেসিকোগ্রাফিক নয় (সামগ্রীর উপর ভিত্তি করে)।


আপনি কেন তারা Stringমান সংরক্ষণ করছেন?
সোটিরিওস ডেলিমনোলিস

আমি যদিও সম্ভবত আমার লেক্সোগ্রাফিকের ব্যবহার অপ্রচলিত ;-)
পি 45 আসন্ন

3
এটা খুব ভুল। এটি লেক্সোগ্রাফিক (এসপি?) ক্রমে কীগুলি সংরক্ষণ করে না। এটি হয় তাদের প্রাকৃতিক ক্রম (যা Comparableকীগুলি প্রয়োগ করে ইন্টারফেসের উপর নির্ভর করে ) ব্যবহার করে বা সরবরাহিত ব্যবহার করে Comparator
সোতিরিওস ডেলিমনলিস

আমি সম্পাদনা করেছি। আপনার কি আরও ভাল মনে হয়, বা আমার উত্তরটি মুছে ফেলা উচিত?
P45 আসন্ন

1
যদি আপনি একটি সরাতে HashSetকরতে TreeSet, আপনার বর্গ বাস্তবায়ন করতে হবে Comparableইন্টারফেস অথবা একটি কাস্টম প্রদান Comparator। অন্যথায়, যেহেতু আপনি একটি বাছাই করতে পারবেন না HashSet, কেবল এটি একটিতে রূপান্তর করুন Listএবং এটি বাছাই করুন।
লুইগি মেন্দোজা

5

আপনি জাভা 8 সংগ্রাহক এবং ট্রিসেট ব্যবহার করতে পারেন

list.stream().collect(Collectors.toCollection(TreeSet::new))


new TreeSet<>(hashSet)আরও সংক্ষিপ্ত এবং সম্ভবত আরও দক্ষ।
ডেভনসোলে

4

অন্যান্য উত্তরে উল্লিখিত হিসাবে আপনি ট্রিসেট ব্যবহার করতে পারেন।

এটি কীভাবে ব্যবহার করা যায় সে সম্পর্কে এখানে আরও একটি বিশদ বিবরণ:

TreeSet<String> ts = new TreeSet<String>();
ts.add("b1");
ts.add("b3");
ts.add("b2");
ts.add("a1");
ts.add("a2");
System.out.println(ts);
for (String s: ts)
    System.out.println(s);

আউটপুট:

[a1, a2, a3, a4, a5]
a1
a2
b1
b2
b3

4

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

আপনি যখনই কোনও উপাদান .োকাবেন ততবার ট্রিটসেট সমস্ত উপাদান স্বয়ংক্রিয়ভাবে সাজবে sort

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

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

List<Integer> list = new ArrayList<>();
list.add(6);
list.add(4);
list.add(4);
list.add(5);
Collections.sort(list);
Set<Integer> unique = new LinkedHashSet<>(list); // 4 5 6
// The above line is not copying the objects! It only copies references.

এখন, আপনি একটি সাজানো সেট পেয়েছেন যদি আপনি এটি একটি তালিকা আকারে চান তবে এটিকে তালিকায় রূপান্তর করুন।


3

@ লেজারবানানা প্রদত্ত উত্তরের ভিত্তিতে আমি অবজেক্টের আইডি অনুসারে বাছাই করা একটি সেট আমার নিজের উদাহরণটি রাখব:

Set<Clazz> yourSet = [...];

yourSet.stream().sorted(new Comparator<Clazz>() {
    @Override
    public int compare(Clazz o1, Clazz o2) {
        return o1.getId().compareTo(o2.getId());
    }
}).collect(Collectors.toList()); // Returns the sorted List (using toSet() wont work)

3

আপনি যদি ব্যবহার করতে চান না তবে TreeSetআপনি এটি চেষ্টা করতে পারেন try

set = set.stream().sorted().collect(Collectors.toCollection(LinkedHashSet::new));

2

আমার নম্র মতামত অনুসারে, লেজারবানানার উত্তরটি শীর্ষ রেটেড উত্তর হতে হবে এবং স্বীকৃত হওয়া উচিত কারণ অন্য সমস্ত উত্তরগুলি নির্দেশিত java.util.TreeSet(বা প্রথমে তালিকায় রূপান্তরিত হয় তারপরে Collections.sort(...)রূপান্তরিত তালিকায় কল করে) আপনার ওপরে কী ধরণের জিনিস HashSetরয়েছে তা জিজ্ঞাসা করতে বিরক্ত করেনি যদি সেই উপাদানগুলির পূর্বনির্ধারিত প্রাকৃতিক ক্রম থাকে বা না থাকে এবং এটি al চ্ছিক প্রশ্ন নয় তবে একটি বাধ্যতামূলক প্রশ্ন।

আপনি শুধু নেই যেতে ও আপনার নির্বাণ শুরু করতে পারেন HashSetএকটি মধ্যে উপাদান TreeSetযদি উপাদান টাইপ ইতিমধ্যে বাস্তবায়ন নেই Comparableইন্টারফেস অথবা আপনি যদি সুস্পষ্টরূপে ক্ষণস্থায়ী নেই Comparatorকরার TreeSetকন্সট্রাকটর।

TreeSetজাভাডক থেকে ,

একটি নতুন, খালি গাছের সেট তৈরি করে, এর উপাদানগুলির প্রাকৃতিক ক্রম অনুসারে বাছাই করা। সেটে Allোকানো সমস্ত উপাদানকে তুলনামূলক ইন্টারফেস প্রয়োগ করতে হবে। তদ্ব্যতীত, এই জাতীয় সমস্ত উপাদান অবশ্যই পারস্পরিক তুলনামূলক হতে হবে: e1.compareTo (e2) অবশ্যই সেটের কোনও উপাদান e1 এবং e2 এর জন্য কোনও ক্লাসকাস্ট এক্সেকশন নিক্ষেপ করবে না। যদি ব্যবহারকারী এই প্রতিবন্ধকতাগুলিকে লঙ্ঘন করে এমন সেটে কোনও উপাদান যুক্ত করার চেষ্টা করে (উদাহরণস্বরূপ, ব্যবহারকারী যার সংখ্যার পূর্ণসংখ্যক সেটে একটি স্ট্রিং উপাদান যুক্ত করার চেষ্টা করে), অ্যাড কলটি একটি ক্লাসকাস্টএক্সসেপশন নিক্ষেপ করবে।

এ কারণেই সমস্ত জাভা 8 স্ট্রিম ভিত্তিক উত্তর - যেখানে আপনি ঘটনাস্থলে আপনার তুলনামূলককে সংজ্ঞায়িত করেন - কেবল তা বিবেচনা করুন কারণ পোজোতে তুলনীয় প্রয়োগ করা alচ্ছিক হয়ে যায়। প্রোগ্রামার যখন প্রয়োজন হিসাবে তুলনামূলক সংজ্ঞায়িত করে। TreeSetএই মৌলিক প্রশ্নটি না জিজ্ঞাসা করে সংগ্রহ করার চেষ্টা করাও ভুল (নিনজার উত্তর)। ধরে নেওয়া অবজেক্টের ধরণগুলি Stringবা Integerএটিও ভুল।

এটি বলে থাকার পরে, অন্যান্য উদ্বেগগুলির মতো,

  1. বাছাই কর্মক্ষমতা
  2. মেমোরি ফুট মুদ্রণ (মূল সেটটি ধরে রাখা এবং প্রতিটি সময় বাছাই করার সময় নতুন সাজানো সেট তৈরি করা বা সেটটি স্থানে রাখুন ইত্যাদি ইত্যাদি)

অন্যান্য প্রাসঙ্গিক পয়েন্টগুলিও হওয়া উচিত। কেবল এপিআইতে নির্দেশ করা কেবল উদ্দেশ্য নয়।

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


1
1. Add all set element in list -> al.addAll(s);
2. Sort all the elements in list using -> Collections.sort(al);


 public class SortSetProblem {
 public static void main(String[] args) {
    ArrayList<String> al = new ArrayList();
    Set<String> s = new HashSet<>();
    s.add("ved");
    s.add("prakash");
    s.add("sharma");
    s.add("apple");
    s.add("ved");
    s.add("banana");
    System.out.println("Before Sorting");
    for (String s1 : s) {
        System.out.print("  " + s1);
    }

    System.out.println("After Sorting");
    al.addAll(s);
    Collections.sort(al);
    for (String set : al) {
        System.out.print(" " + set);
    }
  }
 }

ইনপুট - বেদপ্রকাশ শর্ম আপেল বেদ কলা

আউটপুট - আপেল কলা প্রকাশ শর্ম বেদে


1

যদি আপনি চান চান শেষ Collectionআকারে হতে Setএবং যদি আপনি আপনার নিজের সংজ্ঞায়িত করতে চান natural orderযে এর চেয়ে বরং TreeSetতারপর -

1. রূপান্তর HashSetমধ্যে List
সাজানোর 2. কাস্টম Listব্যবহার Comparator
3. রূপান্তর ফিরে Listমধ্যে LinkedHashSetশৃঙ্খলা বজায় রাখার জন্য
4. প্রদর্শন LinkedHashSet

নমুনা প্রোগ্রাম -

package demo31;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class App26 {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        addElements(set);
        List<String> list = new LinkedList<>();
        list = convertToList(set);
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                int flag = s2.length() - s1.length();
                if(flag != 0) {
                    return flag;
                } else {
                    return -s1.compareTo(s2);
                }
            }
        });
        Set<String> set2 = new LinkedHashSet<>();
        set2 = convertToSet(list);
        displayElements(set2);
    }
    public static void addElements(Set<String> set) {
        set.add("Hippopotamus");
        set.add("Rhinocerous");
        set.add("Zebra");
        set.add("Tiger");
        set.add("Giraffe");
        set.add("Cheetah");
        set.add("Wolf");
        set.add("Fox");
        set.add("Dog");
        set.add("Cat");
    }
    public static List<String> convertToList(Set<String> set) {
        List<String> list = new LinkedList<>();
        for(String element: set) {
            list.add(element);
        }
        return list;
    }
    public static Set<String> convertToSet(List<String> list) {
        Set<String> set = new LinkedHashSet<>();
        for(String element: list) {
            set.add(element);
        }
        return set;
    }
    public static void displayElements(Set<String> set) {
        System.out.println(set);
    }
}

আউটপুট -

[Hippopotamus, Rhinocerous, Giraffe, Cheetah, Zebra, Tiger, Wolf, Fox, Dog, Cat]

এখানে সংগ্রহটি বাছাই করা হয়েছে -

প্রথম - Stringদৈর্ঘ্যের
উত্থানের ক্রম দ্বিতীয় - Stringবর্ণানুক্রমিক শ্রেণিবিন্যাসের উত্থানের ক্রম


0

আপনি নিম্নলিখিত উপায়ে এটি করতে পারেন:

পদ্ধতি 1:

  1. একটি তালিকা তৈরি করুন এবং এতে সমস্ত হ্যাশसेट মান সংরক্ষণ করুন
  2. কালেকশন.সোর্ট () ব্যবহার করে তালিকাটি বাছাই করুন
  3. সন্নিবেশ ক্রমের সংরক্ষণ হিসাবে তালিকাটি আবার লিঙ্কডহ্যাশসেটে সঞ্চয় করুন

পদ্ধতি 2:

  • একটি ট্রিসেট তৈরি করুন এবং এতে সমস্ত মান সংরক্ষণ করুন।

পদ্ধতি 2 আরও বেশি পছন্দনীয় কারণ অন্যান্য পদ্ধতি হ্যাশসেট এবং তালিকার মধ্যে এবং পিছনে তথ্য স্থানান্তর করতে প্রচুর সময় ব্যয় করে।


0

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

// Create a TreeSet object of class E
TreeSet<E> ts = new TreeSet<E> ();

// Convert your HashSet into TreeSet
ts.addAll(yourHashSet);

System.out.println(ts.toString() + "\t Sorted Automatically");

0

আপনি একই জন্য পেয়ারা গ্রন্থাগার ব্যবহার করতে পারেন

Set<String> sortedSet = FluentIterable.from(myHashSet).toSortedSet(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        // descending order of relevance
        //required code
    }
});


0

আপনি এটি এর মতো একটি ট্রিসেটে মুড়িয়ে রাখতে পারেন:

Set mySet = new HashSet();
mySet.add(4);
mySet.add(5);
mySet.add(3);
mySet.add(1);
System.out.println("mySet items "+ mySet);   

TreeSet treeSet = new TreeSet(mySet);   
System.out.println("treeSet items "+ treeSet);   

আউটপুট:
মাইসেট আইটেম [1, 3, 4, 5]
ট্রিসেট আইটেম [1, 3, 4, 5]

Set mySet = new HashSet();
mySet.add("five");
mySet.add("elf");
mySet.add("four");
mySet.add("six");
mySet.add("two");
System.out.println("mySet items "+ mySet);

TreeSet treeSet = new TreeSet(mySet);
System.out.println("treeSet items "+ treeSet);

আউটপুট:
মাইসেট আইটেমগুলি [ছয়, চার, পাঁচ, দুই, এলফ]
ট্রিসেট আইটেম [এলফ, পাঁচ, চার, ছয়, দুই]

এই পদ্ধতির জন্য প্রয়োজনীয়তাটি হ'ল সেট / তালিকার বস্তুগুলি তুলনীয় হওয়া উচিত (তুলনামূলক ইন্টারফেসটি প্রয়োগ করুন)


-4

এই সহজ আদেশটি আমার পক্ষে কৌশলটি করেছে:

myHashSet.toList.sorted

আমি এটি একটি মুদ্রণ বিবৃতিতে ব্যবহার করেছি, সুতরাং আপনার যদি ক্রমটি ক্রমানুসারে ক্রমাগত চলতে হয় তবে আপনার এই থ্রেডে প্রস্তাবিত ট্রিসেটস বা অন্যান্য কাঠামো ব্যবহার করতে হতে পারে।


1
হ্যাশসেট বা সেটের কোনও পদ্ধতি আছে তা আমি দেখতে পাচ্ছি না toList
টমাস আইজিংগার

1
এটি আমার কাছে স্কালার মতো দেখাচ্ছে যা দুর্ভাগ্যক্রমে জাভাতে সমস্যাটি সমাধান করে না।
রবার্তো

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