সম্পত্তি অনুসারে কাস্টম অবজেক্টের অ্যারেলিস্ট বাছাই করুন


1145

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

আমি কাস্টম অবজেক্টগুলির একটি অ্যারেলিস্টকে তাদের একটি বৈশিষ্ট্য অনুসারে বাছাই করতে চেয়েছিলাম: একটি তারিখ অবজেক্ট ( getStartDay())। সাধারণত আমি এগুলির সাথে তুলনা করি item1.getStartDate().before(item2.getStartDate())তাই আমি ভাবছিলাম যে আমি এই জাতীয় কিছু লিখতে পারি কিনা:

public class CustomComparator {
    public boolean compare(Object object1, Object object2) {
        return object1.getStartDate().before(object2.getStartDate());
    }
}

public class RandomName {
    ...
    Collections.sort(Database.arrayList, new CustomComparator);
    ...
}

3
সংশ্লিষ্ট: stackoverflow.com/questions/1814095/...
BalusC

2
এই পোস্টে @ যিশাইয়ের উত্তর কাস্টম্ট বাছাইয়ের জন্য গ্রুপের বাছাই (একাধিক যুক্তি) তুলনা শৃঙ্খলা ব্যবহারের জন্য এনামের মার্জিত ব্যবহার প্রদর্শন করে।
gunalmel

উত্তর:


1535

যেহেতু Dateপ্রয়োগসমূহ Comparable, এর compareToমতো একটি পদ্ধতি রয়েছে String

সুতরাং আপনার প্রথাটি এর Comparatorমতো দেখতে পেল :

public class CustomComparator implements Comparator<MyObject> {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }
}

compare()পদ্ধতি একটি ফিরে আসবে int, তাই আপনি সরাসরি একটি আসতে না পারে booleanমত যাহাই হউক না কেন পরিকল্পনা ছিল।

আপনার বাছাইকরণ কোডটি আপনার লেখার মতোই হবে:

Collections.sort(Database.arrayList, new CustomComparator());

এই সমস্ত লেখার জন্য একটি ছোট্ট উপায়, যদি আপনার তুলনাকারী পুনরায় ব্যবহার করার প্রয়োজন না হয় তবে তা একটি ইনলাইন বেনাম বর্গ হিসাবে লিখতে হবে:

Collections.sort(Database.arrayList, new Comparator<MyObject>() {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }
});

থেকে

আপনি এখন একজন ব্যবহার করে একটি খাটো আকারে শেষ উদাহরণ লিখতে পারেন ল্যামডা অভিব্যক্তি জন্য Comparator:

Collections.sort(Database.arrayList, 
                        (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

এবং Listএকটি sort(Comparator)পদ্ধতি আছে, যাতে আপনি এটি আরও সংক্ষিপ্ত করতে পারেন:

Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

এটি এমন একটি প্রচলিত প্রথা যা একটি কী সহ একটি শ্রেণীর জন্য একটি উত্পন্ন পদ্ধতি রয়েছে :ComparatorComparable

Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));

এই সমস্ত সমতুল্য ফর্ম।


33
এটি ফিরে আসার কথা উল্লেখ করার জন্য +1 এবং এটির জন্য intআপনি আরও ভাল ব্যবহার করতে চান Date#compareTo()। এটি কেন অন্য উত্তরের উপরে উত্সাহিত হয়নি তা আমার বাইরে beyond এই লিঙ্কটিও দরকারী হতে পারে: সান.কম এ অর্ডারিং টিউটোরিয়াল
বালুসসি

5
আমি মনে করি উত্তরের উত্তরে জাভা ৮-তে এটি করার সঠিক উপায়টিও অন্তর্ভুক্ত করা উচিত Col যা আরও ভাল পড়ে এবং ত্রুটির প্রবণতা কম। রিটার্ন o1.getStartDate () লিখতে খুব সহজেই তুলনা করুন (o1.getStartDate ());
কুবা


4
@ কুবা আরও ভাল, ব্যবহার করুন List.sort()
shmosel

3
এই সমাধানটি অ্যান্ড্রয়েড API <24 এ কাজ করে না। আপনারা কি এর জন্য কোনও সমাধান জানেন?
জিম ক্লারমন্টস

194

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

দুটি উদাহরণ:

public class Number implements Comparable<Number> {
    private int value;

    public Number(int value) { this.value = value; }
    public int compareTo(Number anotherInstance) {
        return this.value - anotherInstance.value;
    }
}

public class Chair {
    private int weight;
    private int height;

    public Chair(int weight, int height) {
        this.weight = weight;
        this.height = height;
    }
    /* Omitting getters and setters */
}
class ChairWeightComparator implements Comparator<Chair> {
    public int compare(Chair chair1, Chair chair2) {
        return chair1.getWeight() - chair2.getWeight();
    }
}
class ChairHeightComparator implements Comparator<Chair> {
    public int compare(Chair chair1, Chair chair2) {
        return chair1.getHeight() - chair2.getHeight();
    }
}

ব্যবহার:

List<Number> numbers = new ArrayList<Number>();
...
Collections.sort(numbers);

List<Chair> chairs = new ArrayList<Chair>();
// Sort by weight:
Collections.sort(chairs, new ChairWeightComparator());
// Sort by height:
Collections.sort(chairs, new ChairHeightComparator());

// You can also create anonymous comparators;
// Sort by color:
Collections.sort(chairs, new Comparator<Chair>() {
    public int compare(Chair chair1, Chair chair2) {
        ...
    }
});

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

@ ব্যবহারকারী 387184 - কেবল এটিকে সর্বজনীন করুন, এবং এটি নিজস্ব ফাইলে রাখুন (পছন্দমতো এটি নিজস্ব প্যাকেজও রয়েছে) এবং আপনি আপনার প্রকল্পের যে কোনও জায়গায় এটি ব্যবহার করতে সক্ষম হবেন। অতিরিক্ত ক্লাস তৈরির দরকার নেই!
বিজার্ন

আপনার অর্থ একটি নতুন ফাইল তৈরি করা - একটি ক্লাস নয় এবং কোডে রেখে দেওয়া: "ক্লাস চেয়ার চলাওয়াতকম্পেরেটর তুলনামূলক <চাপাইর> ments .... প্রয়োগ করে?"
ব্যবহারকারী 387184

@ user387184, ঠিক - কিন্তু চাবি শব্দ দিয়ে publicসামনে class
Björn

157

বাছাইয়ের জন্য ArrayListআপনি নিম্নলিখিত কোড স্নিপেট ব্যবহার করতে পারেন:

Collections.sort(studList, new Comparator<Student>(){
    public int compare(Student s1, Student s2) {
        return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
    }
});


এটি সাজায় কিন্তু প্রতিটি উপাদানটির জন্য দ্বিগুণ মান দেয়
স্যাম

44

হ্যা, তুমি পারো. সেখানে তুলনা আইটেম, সঙ্গে দুটি বিকল্প আছে তুলনীয় ইন্টারফেস, এবং comparator ইন্টারফেস।

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

Collections.sort(myArrayList, new MyComparator());

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

Collections.sort(myArrayList);

সংগ্রহগুলি বর্গ এই দরকারী, সাধারণ সরঞ্জামের একটি সংখ্যা উপস্থিত রয়েছে।


42

জাভা 8 লাম্বদা অভিব্যক্তি

Collections.sort(studList, (Student s1, Student s2) ->{
        return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
});

অথবা

Comparator<Student> c = (s1, s2) -> s1.firstName.compareTo(s2.firstName);
studList.sort(c)

3
বাCollections.sort(studList, Comparator.comparing(Student::getFirstName));
হোলেগার

5
.. বাstudList.sort(Comparator.comparing(Student::getFirstName));
অ্যালেক্সিস সি

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

33

জাভা 8 এর সাহায্যে আপনি আপনার তুলকটির জন্য কোনও পদ্ধতি রেফারেন্স ব্যবহার করতে পারেন:

import static java.util.Comparator.comparing;

Collections.sort(list, comparing(MyObject::getStartDate));

@ user387184 দুর্ভাগ্যবশত অ্যান্ড্রয়েড যদিও একটি হতে পারে, সমর্থন করে না জাভা 8 কার্যসংক্রান্ত (আমি এটা পরীক্ষিত নি)।
assylias

14

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

আপনি ল্যাম্বদাজে দিয়ে এই কাজগুলি সমাধান করার চেষ্টা করতে পারেন । আপনি এটি এখানে খুঁজে পেতে পারেন: http://code.google.com/p/lambdaj/

এখানে আপনার একটি উদাহরণ রয়েছে:

সাজান Iterative

List<Person> sortedByAgePersons = new ArrayList<Person>(persons);
Collections.sort(sortedByAgePersons, new Comparator<Person>() {
        public int compare(Person p1, Person p2) {
           return Integer.valueOf(p1.getAge()).compareTo(p2.getAge());
        }
});

ল্যাম্বদা দিয়ে বাছাই করুন

List<Person> sortedByAgePersons = sort(persons, on(Person.class).getAge()); 

অবশ্যই, পারফরম্যান্সে এই ধরণের সৌন্দর্যের প্রভাব রয়েছে (গড়ে ২ বার), তবে আপনি আরও পাঠযোগ্য কোড খুঁজে পেতে পারেন?


এটি সাজায় কিন্তু প্রতিটি উপাদানকে কীভাবে এড়াতে হবে তার দ্বিগুণ মান দেয়
স্যাম

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

আমাকে অন্য আইটেমগুলি ফোরচ লুপে এমনকি আইটেমগুলি সরিয়ে ফেলতে হয়েছিল এটি আমাকে প্রতিটি সামগ্রীর দ্বিগুণ দেয়।
স্যাম

13
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;

public class test {

public static class Person {
    public String name;
    public int id;
    public Date hireDate;

    public Person(String iname, int iid, Date ihireDate) {
        name = iname;
        id = iid;
        hireDate = ihireDate;
    }

    public String toString() {
        return name + " " + id + " " + hireDate.toString();
    }

    // Comparator
    public static class CompId implements Comparator<Person> {
        @Override
        public int compare(Person arg0, Person arg1) {
            return arg0.id - arg1.id;
        }
    }

    public static class CompDate implements Comparator<Person> {
        private int mod = 1;
        public CompDate(boolean desc) {
            if (desc) mod =-1;
        }
        @Override
        public int compare(Person arg0, Person arg1) {
            return mod*arg0.hireDate.compareTo(arg1.hireDate);
        }
    }
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    SimpleDateFormat df = new SimpleDateFormat("mm-dd-yyyy");
    ArrayList<Person> people;
    people = new ArrayList<Person>();
    try {
        people.add(new Person("Joe", 92422, df.parse("12-12-2010")));
        people.add(new Person("Joef", 24122, df.parse("1-12-2010")));
        people.add(new Person("Joee", 24922, df.parse("12-2-2010")));
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Collections.sort(people, new Person.CompId());
    System.out.println("BY ID");
    for (Person p : people) {
        System.out.println(p.toString());
    }

    Collections.sort(people, new Person.CompDate(false));
    System.out.println("BY Date asc");
    for (Person p : people) {
        System.out.println(p.toString());
    }
    Collections.sort(people, new Person.CompDate(true));
    System.out.println("BY Date desc");
    for (Person p : people) {
        System.out.println(p.toString());
    }

}

}

7
স্ট্যাকওভারফ্লোতে স্বাগতম। এই প্রশ্নের উত্তর কিছুদিন আগে দেওয়া হয়েছিল। পুরানো থ্রেডগুলি পুনরুত্থিত করার আগে, দয়া করে নিশ্চিত হয়ে নিন যে আপনার প্রতিক্রিয়া থ্রেডে উল্লেখযোগ্য কিছু যুক্ত করেছে।
লেইগ করুন

1
আপনার উত্তরে ব্যাখ্যা যোগ করুন।
আরশসফট

শুধু সংকলন এবং চালান। কোডটি মন্তব্য এবং ব্যাখ্যা।
চার্লসডাব্লু

9

জাভা 8 সহ সেরা সহজ উপায় হ'ল ইংলিশ বর্ণানুক্রমিক বাছাইয়ের জন্য

শ্রেণি বাস্তবায়ন

public class NewspaperClass implements Comparable<NewspaperClass>{
   public String name;

   @Override
   public int compareTo(NewspaperClass another) {
      return name.compareTo(another.name);
   }
}

সাজান

  Collections.sort(Your List);

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

শ্রেণি বাস্তবায়ন

public class NewspaperClass implements Comparator<NewspaperClass> {
   public String name;
   public Boolean isUserNewspaper=false;
   private Collator trCollator = Collator.getInstance(new Locale("tr_TR"));



   @Override
   public int compare(NewspaperClass lhs, NewspaperClass rhs) {
      trCollator.setStrength(Collator.PRIMARY);
      return trCollator.compare(lhs.name,rhs.name);
   }
}

সাজান

Collections.sort(your array list,new NewspaperClass());

9

ফাংশন এবং পদ্ধতি রেফারেন্স

Collections.sortপদ্ধতি কেমন করতে Listএকটি ব্যবহার Comparatorআপনি পাস। এটি Comparatorসেই Comparator.comparingপদ্ধতিটি ব্যবহার করে প্রয়োগ করা যেতে পারে যেখানে আপনি প্রয়োজনীয় হিসাবে কোনও পদ্ধতি রেফারেন্স পাস করতে পারেন Function। ভাগ্যক্রমে, আসল কোডটি এই বর্ণনার চেয়ে অনেক সহজ এবং খাটো।

জাভা 8 এর জন্য:

Collections.sort(list, comparing(ClassName::getName));

অথবা

Collections.sort(list, comparing(ClassName::getName).reversed());

আরেকটি উপায়

Collections.sort(list, comparing(ClassName::getName, Comparator.nullsLast(Comparator.naturalOrder())));

1
কলটির জন্য এপিআই স্তরের 24
অক্ষয় ভাঙ্গা

6

থেকে Java 8এবং অনওয়ার্ড আমরা ব্যবহার করতে হবে না Collections.sort()সরাসরি। Listইন্টারফেসের একটি ডিফল্ট sort()পদ্ধতি রয়েছে:

List<User> users = Arrays.asList(user1,user2,user3);
users.sort( (u1, u2) -> { 
return u1.getFirstName.compareTo(u2.getFirstName());}); 

Http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html দেখুন ।


6

জাভা 8 ল্যাম্বদা বাছাইকে ছোট করে।

Collections.sort(stdList, (o1, o2) -> o1.getName().compareTo(o2.getName()));

2
Collections.sort(stdList, Comparator.comparing(SomeClass::getName));
বিসিএসবি 1001


5

হ্যাঁ, এই উত্তরটি উদাহরণস্বরূপ সম্ভব আমি vক্লাসের সম্পত্তি অনুসারে সাজিয়েছিIndexValue

    // Sorting by property v using a custom comparator.
    Arrays.sort( array, new Comparator<IndexValue>(){
        public int compare( IndexValue a, IndexValue b ){
            return a.v - b.v;
        }
    });

আপনি যদি এখানে লক্ষ্য করেন তবে আমি একটি বেনামে অভ্যন্তরীণ শ্রেণি তৈরি করছি (যা ক্লোজারগুলির জন্য জাভা) এবং এটি sortক্লাসের পদ্ধতিতে সরাসরি পাস করছিArrays

আপনার অবজেক্টটি কার্যকর করতে পারে Comparable(এটি স্ট্রিং এবং জাভার বেশিরভাগ মূল গ্রন্থাগারগুলিই করে) তবে এটি শ্রেণীর নিজেরাই "প্রাকৃতিক সাজানোর ক্রম" সংজ্ঞায়িত করবে এবং আপনাকে নতুন প্লাগ করতে দেবে না।


1
... তবে যা আপনি কেবল Comparator
এটিকে

5

আমি উত্তর খুঁজে পেলাম না যদি এই সমস্ত উত্তর তুলনামূলক বাস্তবায়ন করতে বা কোনও সহায়ক তুলনীয় ইন্টারফেস পেতে অন্তর্নিহিত শ্রেণির (অবজেক্ট) উপর নির্ভর করে না।

আমার সমাধানের সাথে নয়! নিম্নলিখিত কোডটি আপনাকে স্ট্রিংয়ের নাম জেনে বস্তুর ক্ষেত্রের তুলনা করতে দেয়। নামটি ব্যবহার না করার জন্য আপনি এটিকে সহজেই সংশোধন করতে পারেন, তবে তারপরে আপনাকে এটিকে প্রকাশ করতে হবে বা যে তুলনায় আপনি তুলনা করতে চান তার একটি নির্মাণ করতে হবে।

Collections.sort(anArrayListOfSomeObjectPerhapsUsersOrSomething, new ReflectiveComparator(). new ListComparator("name"));

public class ReflectiveComparator {
    public class FieldComparator implements Comparator<Object> {
        private String fieldName;

        public FieldComparator(String fieldName){
            this.fieldName = fieldName;
        }

        @SuppressWarnings({ "unchecked", "rawtypes" })
        @Override
        public int compare(Object object1, Object object2) {
            try {
                Field field = object1.getClass().getDeclaredField(fieldName);
                field.setAccessible(true);

                Comparable object1FieldValue = (Comparable) field.get(object1);
                Comparable object2FieldValue = (Comparable) field.get(object2);

                return object1FieldValue.compareTo(object2FieldValue);
            }catch (Exception e){}

            return 0;
        }
    }

    public class ListComparator implements Comparator<Object> {
        private String fieldName;

        public ListComparator(String fieldName) {
            this.fieldName = fieldName;
        }

        @SuppressWarnings({ "unchecked", "rawtypes" })
        @Override
        public int compare(Object object1, Object object2) {
            try {
                Field field = object1.getClass().getDeclaredField(fieldName);
                field.setAccessible(true);
                Comparable o1FieldValue = (Comparable) field.get(object1);
                Comparable o2FieldValue = (Comparable) field.get(object2);

                if (o1FieldValue == null){ return -1;}
                if (o2FieldValue == null){ return 1;}
                return o1FieldValue.compareTo(o2FieldValue);
            } catch (NoSuchFieldException e) {
                throw new IllegalStateException("Field doesn't exist", e);
            } catch (IllegalAccessException e) {
                throw new IllegalStateException("Field inaccessible", e);
            }
        }
    }
}


5

আপনি জাভা 8 ব্যবহার করে বাছাই করতে পারেন

yourList.sort(Comparator.comparing(Classname::getName));

or

yourList.stream().forEach(a -> a.getBObjects().sort(Comparator.comparing(Classname::getValue)));

3

এই কোড স্নিপেটগুলি দরকারী হতে পারে। আপনি যদি আমার ক্ষেত্রে কোনও অবজেক্টকে বাছাই করতে চান তবে আমি ভলিউম নাম অনুসারে বাছাই করতে চাই:

public List<Volume> getSortedVolumes() throws SystemException {
    List<Volume> volumes = VolumeLocalServiceUtil.getAllVolumes();
    Collections.sort(volumes, new Comparator<Volume>() {
        public int compare(Volume o1, Volume o2) {
            Volume p1 = (Volume) o1;
            Volume p2 = (Volume) o2;
            return p1.getVolumeName().compareToIgnoreCase(
                    p2.getVolumeName());
        }
    });
    return volumes;
}

এইটা কাজ করে. আমি আমার jsp এ এটি ব্যবহার করি।


3

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

SortKeys sortKeys = new SortKeys();
sortKeys.addField("firstName")
            .addField("age", true); // This (true) will sort the age descending

// Other ways to specify a property to the sorter are
//      .addField("lastName", String.class);
//      .addField("dob", Date.class, true);

// Instantiate a ListSorter
ListSorter listSorter = new ListSorter();

// Pass the data to sort (listToSort) and the "by keys" to sort (sortKeys)
List sortedList = (List<Person>) listSorter.sortList(listToSort, sortKeys);

3

আপনি 2016 সালে স্টুটগার্ট জার্মানের জাভা ফোরামের এই উপস্থাপনাটির দিকে নজর রাখতে পারেন।

শুধুমাত্র কয়েকটি স্লাইডই জার্মান ভাষা ব্যবহার করে, সামগ্রীর 99% সামগ্রী "ইংরেজি ভিত্তিক" জাভা উত্স কোড; মত

someCollection.sort(
  OurCustomComparator
    .comparing(Person::getName)
    .thenComparing(Person::getId)
);

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

আপনি জাভা 8 এ থাকলে আপনাকে শুরু করার জন্য সেখানে প্রচুর পরিমাণে উপাদান খুঁজে পাওয়া যায়।


3

1.8 সাল থেকে নতুন হ'ল কালেকশন.সোর্ট () ব্যবহার না করে একটি তালিকা.সোর্ট () পদ্ধতি যা আপনি সরাসরি mylistcontainer.sort () কল করেন

এখানে একটি কোড স্নিপেট রয়েছে যা List.sort () বৈশিষ্ট্যটি দেখায়:

List<Fruit> fruits = new ArrayList<Fruit>();
fruits.add(new Fruit("Kiwi","green",40));
fruits.add(new Fruit("Banana","yellow",100));
fruits.add(new Fruit("Apple","mixed green,red",120));
fruits.add(new Fruit("Cherry","red",10));

// a) using an existing compareto() method
fruits.sort((Fruit f1,Fruit f2) -> f1.getFruitName().compareTo(f2.getFruitName()));
System.out.println("Using String.compareTo(): " + fruits);
//Using String.compareTo(): [Apple is: mixed green,red, Banana is: yellow, Cherry is: red, Kiwi is: green]

// b) Using a comparable class
fruits.sort((Fruit f1,Fruit f2) -> f1.compareTo(f2));  
System.out.println("Using a Comparable Fruit class (sort by color): " + fruits);
// Using a Comparable Fruit class (sort by color): [Kiwi is green, Apple is: mixed green,red, Cherry is: red, Banana is: yellow]

ফল শ্রেণি হ'ল:

public class Fruit implements Comparable<Fruit>
{
    private String name;
    private String color;
    private int quantity;

    public Fruit(String name,String color,int quantity)
    { this.name = name; this.color = color; this.quantity = quantity; }

    public String getFruitName() { return name; }        
    public String getColor() { return color; }  
    public int getQuantity() { return quantity; }

    @Override public final int compareTo(Fruit f) // sorting the color
    {
        return this.color.compareTo(f.color);
    }     
    @Override public String toString()
    {   
        return (name + " is: " + color);
    }
} // end of Fruit class   

2

আপনার কাস্টমকমারেটর ক্লাসটি ব্যবহার করার জন্য অবশ্যই java.util.Comparator প্রয়োগ করতে হবে। এটি অবশ্যই তুলনা () এবং সমান ()

তুলনা () অবশ্যই প্রশ্নের উত্তর দিতে হবে: বস্তু 1 কি 2 টির চেয়ে কম, সমান বা বৃহত্তর?

পূর্ণ দস্তাবেজ: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html


1

আমি এই প্রক্রিয়াটি পছন্দ করি:

public class SortUtil
{    
    public static <T> List<T> sort(List<T> list, String sortByProperty)
    {
            Collections.sort(list, new BeanComparator(sortByProperty));
            return list;
    }
}

List<T> sortedList = SortUtil<T>.sort(unsortedList, "startDate");

যদি আপনার অবজেক্টের তালিকায় কোনও সম্পত্তি বলা হয় startDate, আপনি এটি বার বার ব্যবহার করুন। আপনি তাদের চেইন করতে পারেন startDate.time

এটি আপনার বস্তুর করা প্রয়োজন Comparableযা উপায়ে আপনি একটি প্রয়োজন compareTo, equalsএবং hashCodeবাস্তবায়ন।

হ্যাঁ, এটি দ্রুততর হতে পারে ... তবে এখন আপনাকে প্রতিটি ধরণের বাছাইয়ের জন্য একটি নতুন তুলক তৈরি করতে হবে না। যদি আপনি ডেভ সময় বাঁচাতে এবং রানটাইম ছেড়ে দিতে পারেন তবে আপনি এটির সাথে যেতে পারেন।


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

0

জাভা 8 ব্যবহার Comparatorব্যবহার করে এক লাইনে থাকা সংজ্ঞায়িত করতে পারেComparator.comparing()

নিম্নলিখিত যে কোনও একটি ব্যবহার করুন:

বিকল্প 1:

listToBeSorted.sort(Comparator.comparing(CustomObject::getStartDate));

বিকল্প 2:

Collections.sort(listToBeSorted, Comparator.comparing(CustomObject::getStartDate));

1
3 বছর আগে থেকে এই উত্তরটির সদৃশ বলে মনে হচ্ছে ।
তুলসী বাউর্ক

1
ঠিক নয়, এখানে কেবলমাত্র বিকল্প 2 উল্লিখিত উত্তরের বিকল্প 1 এর সমান। আমি মনে করি দুটি ভিন্ন উত্তরের একই প্রশ্নের উত্তর থাকলে কমপক্ষে কিছু মিল থাকতে পারে।
সাহিল ছাবার

0

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

public class MyCustomClass implements Comparable<MyCustomClass>{

..........

 @Override
public int compareTo(MyCustomClass a) {
    if(this.getStartDate().before(a.getStartDate())){
        return -1;
    }else if(a.getStartDate().before(this.getStartDate())){
        return 1;
    }else {
        return 0;
    }
}

একটি ঋণাত্মক সংখ্যা নির্দেশ করে যে এই বস্তু তুলনা করা হচ্ছে চেয়ে কম। একটি ধনাত্মক সংখ্যা নির্দেশ করে যে এটি বস্তুর তুলনায় বড় এবং জিরো অর্থ এই বস্তু সমান।

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

আপনি তুলনামূলক ইন্টারফেস (প্রকাশ: আমি লেখক;)) সম্পর্কে আরও পড়তে চাইলে আপনি এই নিবন্ধটি পরীক্ষা করতে পারেন https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/


0

আপনি বাছাই করতে চান (নেস্টেড) সম্পত্তিটিতে যদি কেবল স্ট্রিং সম্পত্তির পথ থাকে তবে আপনি স্প্রিংস প্রপার্টি কমপ্লেটরও ব্যবহার করতে পারেন:

List<SomeObject> list = ...;
PropertyComparator<HitWithInfo> propertyComparator = new PropertyComparator<>(
    "property.nested.myProperty", false, true);
list.sort(propertyComparator);

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


0

জাভা -8 স্ট্রিম এপিআই ব্যবহার করে আপনি এর মাধ্যমে বাছাই করতে পারেন ArrayList:

 Comparator<Person> birthdayComparator = Comparator.comparing(Person::getBirthday);
 List<Person> sortedList = list.stream().sorted(birthdayComparator).collect(toList());

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