java - সম্পত্তি দ্বারা কাস্টম অবজেক্টের ArrayList সাজান



12 Answers

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

দুটি উদাহরণ:

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) {
        ...
    }
});
java sorting date comparator

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

আমি তাদের বৈশিষ্ট্যের একটি দ্বারা কাস্টম বস্তুর একটি অ্যারেস্টিস্ট সাজানোর চেয়েছিলেন: একটি তারিখ বস্তু ( getStartDay() )। সাধারণত আমি item1.getStartDate().before(item2.getStartDate()) তাদের সাথে তুলনা করি 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);
    ...
}



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

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

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

এটি সাজানোর পদ্ধতির জন্য আপনার তুলনাকারীকে সংগ্রহ করার জন্য Collections.sort পদ্ধতিটি সৃষ্টি করবে। যদি অ্যারেস্টিস্টের বস্তু তুলনামূলকভাবে বাস্তবায়িত হয় তবে আপনি এর পরিবর্তে এটির মতো কিছু করতে পারেন:

Collections.sort(myArrayList);

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




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

import static java.util.Comparator.comparing;

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



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

আপনি LambdaJ সঙ্গে এই কাজগুলো সমাধানের চেষ্টা করতে পারেন। আপনি এখানে এটি খুঁজে পেতে পারেন: 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());
        }
});

Lambda সঙ্গে সাজান

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

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




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 দেখুন।




আপনি গুওয়াকে Ordering চেষ্টা করতে পারেন:

Function<Item, Date> getStartDate = new Function<Item, Date>() {
    public Date apply(Item item) {
        return item.getStartDate();
    }
};

List<Item> orderedItems = Ordering.natural().onResultOf(getStartDate).
                          sortedCopy(items);



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

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

or

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



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

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

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);
            }
        }
    }
}



২016 সালে স্টুটগার্ট জার্মানিতে জাভা ফোরামে আপনি এই presentation নজর রাখতে পারেন।

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

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

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

যদি আপনি java8 এ যান, আপনি শুরু করতে সেখানে প্রচুর পরিমাণে উপাদান খুঁজে পাবেন।




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

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

সম্পূর্ণ ডক্স: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html




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

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 বাস্তবায়ন প্রয়োজন।

হ্যাঁ, এটি দ্রুত হতে পারে ... তবে এখন আপনাকে প্রতিটি ধরণের সাজানোর জন্য একটি নতুন তুলনা করতে হবে না। আপনি dev সময় সংরক্ষণ এবং রানটাইম উপর ছেড়ে দিতে পারেন, আপনি এই এক সঙ্গে যেতে পারে।




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

নিচের কোনটি ব্যবহার করুন:

বিকল্প 1:

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

বিকল্প 2:

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





Related