আমি জাভাতে কোনও তালিকায় একটি সেট কীভাবে বাছাই করব?


169

জাভাতে, আমার কাছে একটি আছে Setএবং আমি এটিকে বাছাই করতে চাই Listjava.util.Collectionsপ্যাকেজে এমন কোনও পদ্ধতি আছে যা আমার জন্য এটি করবে?

উত্তর:


214

ওপি প্রদত্ত উত্তরটি সেরা নয়। এটি অদক্ষ, কারণ এটি একটি নতুন এবং তৈরি করেList অপ্রয়োজনীয় নতুন অ্যারে তৈরি করে। এছাড়াও, জেনেরিক অ্যারেতে সুরক্ষা সম্পর্কিত ধরণের সমস্যার কারণে এটি "চেক না করা" সতর্কতা উত্থাপন করে।

পরিবর্তে, এই জাতীয় কিছু ব্যবহার করুন:

public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
  List<T> list = new ArrayList<T>(c);
  java.util.Collections.sort(list);
  return list;
}

এখানে ব্যবহারের উদাহরণ রয়েছে:

Map<Integer, String> map = new HashMap<Integer, String>();
/* Add entries to the map. */
...
/* Now get a sorted list of the *values* in the map. */
Collection<String> unsorted = map.values();
List<String> sorted = Util.asSortedList(unsorted);

3
ধন্যবাদ! এই দমন-সতর্কতা সর্বদা আমাকে বিরক্ত করত।
জেরেমি স্টেইন

4
@ সুনলেও ক্লাসটিই আমার লেখার পদ্ধতিটি Utilধারণ করে asSortedList()। অন্য কথায়, আপনি Utilনিজে ক্লাস লেখেন এবং এতে কোডটি রেখে দেন।
এরিকসন

1
হা হা আমি এটি জাভা.উটিল মত ডিফল্ট প্যাক থেকে ভেবেছি ঠিক আছে আপনাকে ধন্যবাদ।
সানলিও

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

1
কেবলমাত্র উপরের উত্তরটি পড়ে লোকদের কাছে একটি নোট হিসাবে: নীচে এনএসচমের উত্তরটি দেখুন, যা জাভা 8 এর স্ট্রিম ব্যবহার করে uses আপনি যদি জাভা 8 ব্যবহার করতে পারেন তবে এটির জন্য যান। তারা আরও নমনীয় এবং দক্ষ।
ফিল্ড

74

সাজানো সেট:

return new TreeSet(setIWantSorted);

বা:

return new ArrayList(new TreeSet(setIWantSorted));

এটি আমার প্রথম চিন্তা ছিল, তবে প্রশ্নকর্তা একটি তালিকা চেয়েছিলেন
অ্যালেক্স বি

@ অ্যালেক্স: এই পদ্ধতির এখনও ব্যবহার করা যেতে পারে; নতুন অ্যারেলিস্টটি ফেরত দিন (নতুন ট্রিসেট (সেটআইওয়ান্টসোর্ট))
জোনিক

1
আমি আসলে এই সমাধানটি ব্যবহার করেছি, তবে আমি এটির পরামর্শ দেব না। ট্রিসেটের নথি হিসাবে বলা হয়েছে ( ডাউনলোড. oracle.com/javase/1.4.2/docs/api/java/util/… দেখুন ), এটি কার্যকরভাবে সমান () পদ্ধতির পরিবর্তে তুলনামূলক () পদ্ধতি ব্যবহার করে - তাই আপনি যদি সেটে দুটি বস্তু রয়েছে যার সমান সমান () ফলাফল রয়েছে, সেগুলি সদৃশ হিসাবে দেখা হবে এবং যেমন, ট্রিসেটে যুক্ত হবে না। সতর্ক থাকুন।
fwielstra

24
@ ফুইয়েলস্ট্রা: ইনপুটটিও যেহেতু সমান সমান আপনার কীভাবে থাকতে পারে Set?
রায়ানপ্রায়গো

2
@ryanprayogo এটি কেবল উল্লেখযোগ্য, যেমন এসকে new TreeSetগ্রহণ করে, Collectionকেবলমাত্র Setএস। এই উত্তরটি যারা পড়ছেন তারা সকলেই একটি ব্যবহার করবেন না Set, যদিও এটি মূল প্রশ্নটিই জিজ্ঞাসা করছে।
ক্রিস

44
List myList = new ArrayList(collection);
Collections.sort(myList);

... কৌশলটি করা উচিত। প্রযোজ্য জেনেরিক্সের সাথে গন্ধ যুক্ত করুন।


আমার কাছে একটি দরকারী স্নিপেট ছিল যা আমি সম্প্রদায়কে দান করতে চেয়েছিলাম। আমি যখন তথ্য অনুসন্ধান করেছি, আমি এটি খুঁজে পেলাম না। আমি পরবর্তী ব্যক্তির কাজ সহজ করার চেষ্টা করছিলাম। stackoverflow.com/questions/18557/…
জেরেমি স্টেইন

1
হ্যাঁ, অবশ্যই, তবে আপনি যে লিঙ্কটি সরবরাহ করেছেন তা আসলে একটি আসল প্রশ্ন সম্পর্কে কথা বলা (যেমন যাদের উত্তর নেই, তবে এটি সন্ধান করুন)। আপনার প্রশ্নটি এখানে কেবল উত্তর দেওয়ার জন্য ছিল ... আমি আসলে কয়েকশো প্রশ্ন enterুকতে পারি এবং নিজেই উত্তর দিতে পারি; ঐটা আসল কথা না!
সেব

5
@ সেব: আমি একমত নই এই প্রশ্নটিতে আমি কোনও ভুল দেখছি না। স্পষ্টতই এটি খুব সাধারণ প্রশ্ন ছিল না এবং এখন সে আগের চেয়ে আরও ভাল উপায় জানে!
মাইকেল

3
এটা তোলে ছিল একটি আসল প্রশ্নটি, কিন্তু আমি উত্তর নিজেকে খুঁজে পাওয়া যায় পরে Google স্বল্প এসেছেন। স্ট্যাকওভারফ্লো তখন ছিল না। আমি এটি আমার ওয়েবসাইটে পোস্ট করেছি এবং এটি অন্য কাউকে সহায়তা করেছে, তাই আমি ভেবেছিলাম এটি এখানে দরকারী।
জেরেমি স্টেইন

বোনাস: এবং যদি আপনি নিজের অবজেক্টের ধরণের বাছাই করে থাকেন তবে আপনি সর্বদা পদ্ধতিটি প্রয়োগ Comparableএবং ওভাররাইড করতে পারেন compareTo
ন্যাবস্টার

42

জাভা 8 এর স্ট্রিম দিয়ে আপনি এটি কীভাবে করতে পারেন তা এখানে:

mySet.stream().sorted().collect(Collectors.toList());

বা একটি কাস্টম তুলক সঙ্গে:

mySet.stream().sorted(myComparator).collect(Collectors.toList());

9

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

    List<Employees> empList = new LinkedList<Employees>(EmpSet);

    class EmployeeComparator implements Comparator<Employee> {

            public int compare(Employee e1, Employee e2) {
                return e1.getName().compareTo(e2.getName());
            }

        }

   Collections.sort(empList , new EmployeeComparator ());

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


5

এটি করার কোনও একক পদ্ধতি নেই। এটা ব্যবহার কর:

@SuppressWarnings("unchecked")
public static <T extends Comparable> List<T> asSortedList(Collection<T> collection) {
  T[] array = collection.toArray(
    (T[])new Comparable[collection.size()]);
  Arrays.sort(array);
  return Arrays.asList(array);
}

এখানে একটি কালেকশনস.সোর্ট ফাংশনও রয়েছে তবে আমি মনে করি এটি একই কাজ করে। যাইহোক +1।
কুকিঅফফোর্টুন

1
কালেকশনস.সোর্ট প্যারামিটার হিসাবে একটি তালিকা নেয়।
জেরেমি স্টেইন

3

আপনি একটি মধ্যে একটি সেট রূপান্তর করতে পারেন ArrayList, যেখানে আপনি বাছাই করতে পারেন ArrayListব্যবহার Collections.sort(List)

কোডটি এখানে:

keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);     
Collections.sort(list);

3
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);

list.addAll(sortedset);

যেখানে অরিজিনাল্ট = অরসেটেড সেট এবং তালিকা = ফিরিয়ে দিতে হবে


ট্রিসেট তালিকাটি ডি-ডুপস করে যা আপনি যদি ধরে না নেন তবে ভুল ফলাফল হতে পারে।
এন্থনিমনোরি

2

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

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());

0

আমি এই কোডটি ব্যবহার করছি, যা আমি উপরের স্বীকৃত উত্তরের চেয়ে বেশি ব্যবহারিক বলে মনে করি:

List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.