Sortuj ArrayList własnych obiektów według właściwości

Czytałem o sortowaniu ArrayLists za pomocą komparatora, ale we wszystkich przykładach ludzie używali compareTo, który według niektórych badań jest metodą dla łańcuchów.

Chciałem posortować Arraylistę niestandardowych obiektów według jednej z ich właściwości: obiektu daty (getStartDay()). Normalnie porównuję je według item1.getStartDate().before(item2.getStartDate()) więc zastanawiałem się, czy mógłbym napisać coś w stylu:

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);
    ...
}
Author: james.garriss, 2010-05-06

29 answers

Od Date narzędzia Comparable, ma metodę compareTo tak jak robi to String.

Więc twój zwyczaj Comparator może wyglądać tak:

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

Metoda compare() musi zwracać int, więc nie możesz zwrócić bezpośrednio boolean tak, jak i tak planowałeś.

Twój kod sortowania będzie tak, jak napisałeś:

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

Nieco krótszym sposobem napisania tego wszystkiego, jeśli nie musisz ponownie używać komparatora, jest napisanie go jako inline anonymous class:

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

Od java-8

Możesz teraz napisać ostatni przykład w krótszej formie, używając wyrażenia lambda dla Comparator:

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

I List ma sort(Comparator) metoda, więc można to jeszcze skrócić:

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

Jest to tak popularny idiom, że istnieje wbudowana metoda do generowania Comparator dla klasy z kluczem Comparable:

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

Wszystkie te formy są równoważne.

 1604
Author: Michael Myers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Klasy, które mają naturalny porządek sortowania (przykładowy numer klasy) powinny zaimplementować porównywalny interfejs, podczas gdy klasy, które nie mają naturalnego porządku sortowania (przykładowy krzesło klasy) powinny być wyposażone w komparator (lub anonimową klasę komparatora).

Dwa przykłady:

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

Użycie:

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) {
        ...
    }
});
 196
Author: Björn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-06 21:45:27

Do sortowania ArrayList możesz użyć poniższego fragmentu kodu:

Collections.sort(studList, new Comparator<Student>(){
    public int compare(Student s1, Student s2) {
        return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
    }
});
 158
Author: blackpanther,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-16 11:34:20

Tak, możesz. Istnieją dwie opcje porównywania elementów, interfejs porównywalny i Interfejs porównujący .

Oba te interfejsy pozwalają na różne zachowania. Comparable pozwala na to, aby obiekt zachowywał się tak, jak opisane ciągi znaków (w rzeczywistości String implementuje porównywalne). Drugi, komparator, pozwala Ci robić to, o co prosisz. Zrobiłbyś to tak:

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

To spowoduje zbiory.sort method to use your komparator do sortowania. Jeśli obiekty w ArrayList implementują porównywalne, możesz zamiast tego zrobić coś takiego:

Collections.sort(myArrayList);

Klasa Collections zawiera szereg tych użytecznych, powszechnych narzędzi.

 44
Author: aperkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-06 21:17:40

Java 8 wyrażenie lambda

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

Lub

Comparator<Student> c = (s1, s2) -> s1.firstName.compareTo(s2.firstName);
studList.sort(c)
 44
Author: Sorter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-29 06:57:08

W Javie 8 możesz użyć referencji metody dla swojego komparatora:

import static java.util.Comparator.comparing;

Collections.sort(list, comparing(MyObject::getStartDate));
 36
Author: assylias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 15:19:27

Ponieważ technologie pojawiają się codziennie, odpowiedź zmieni się w czasie. Spojrzałam na Lambdaja i wydaje mi się bardzo interesująca.

Możesz spróbować rozwiązać te zadania za pomocą LambdaJ . Znajdziesz go tutaj: http://code.google.com/p/lambdaj/

Oto przykład:

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

Sortuj za pomocą lambda

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

Oczywiście, posiadanie tego rodzaju piękna wpływa na wydajność (średnio 2 razy), ale może znalazłeś bardziej czytelny kod?

 14
Author: Federico Piazza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 17:49:34
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());
    }

}

}
 13
Author: CharlesW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-03 15:32:34

Najlepszy łatwy sposób z JAVA 8 jest dla angielskiego alfabetycznego sortowania

Implementacja Klasy

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

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

Sortuj

  Collections.sort(Your List);

Jeśli chcesz sortować alfabet, który zawiera znaki inne niż angielskie, możesz użyć ustawień regionalnych... Poniżej kodu użyj sortowania znaków tureckich...

Implementacja Klasy

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

Sortuj

Collections.sort(your array list,new NewspaperClass());
 9
Author: Ucdemir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-26 21:57:28

Function & method reference

The Collections.sort metoda może sortować List korzystanie z Comparator pasujesz. Że Comparator można zaimplementować za pomocą Comparator.comparing metoda, w której można przekazać odniesienie do metody jako niezbędne Function. Na szczęście rzeczywisty kod jest znacznie prostszy i krótszy niż ten opis.

Dla Javy 8:

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

Lub

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

Innym sposobem jest

Collections.sort(list, comparing(ClassName::getName, Comparator.nullsLast(Comparator.naturalOrder())));
 9
Author: Arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-28 21:22:13

Możesz sortować używając java 8

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

or

yourList.stream().forEach(a -> a.getBObjects().sort(Comparator.comparing(Classname::getValue)));
 7
Author: Seeker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-06 04:26:37

Od Java 8 i dalej nie musimy używać Collections.sort() bezpośrednio. List interfejs posiada domyślną metodę sort():

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

Zobacz http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .

 6
Author: Vishnu Vasudevan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-03 08:16:57

Java 8 Lambda skraca sort.

Collections.sort(stdList, (o1, o2) -> o1.getName().compareTo(o2.getName()));
 6
Author: javasenior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-31 11:06:04

Możesz użyć komparatora Bean do sortowania na dowolnej właściwości w twojej klasie niestandardowej.

 5
Author: camickr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-06 21:29:16

Tak, jest to możliwe na przykład w ta odpowiedź sortuję według właściwości v klasy 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;
        }
    });

Jeśli zauważysz tutaj, że tworzę anonimową klasę wewnętrzną (która jest Javą do zamykania ) i przekazuję ją bezpośrednio do metody sort klasy Arrays

Twój obiekt może również zaimplementować Comparable (tak robi String i większość podstawowych bibliotek w Javie), ale to definiowałoby "naturalny porządek sortowania" klasy it self, a nie pozwól podłączyć nowe.

 5
Author: OscarRyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:45

Stwierdziłem, że większość, jeśli nie wszystkie z tych odpowiedzi, opiera się na podstawowej klasie (obiekcie), aby zaimplementować porównywalny lub mieć porównywalny interfejs helpera.

Nie z moim rozwiązaniem! Poniższy kod pozwala porównać pole obiektu, znając jego nazwę. Możesz łatwo zmodyfikować go, aby nie używał nazwy, ale następnie musisz go odsłonić lub skonstruować jeden z obiektów, z którymi chcesz porównać.
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
Author: Kevin Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-25 19:28:41

Możesz spróbować Guava zamawiając :

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);
 5
Author: Vitalii Fedorenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-16 23:06:15

Twoja klasa customComparator musi zaimplementować Javę.util.Komparator w celu zastosowania. musi również nadpisać compare () i equals ()

Compare () musi odpowiedzieć na pytanie: czy obiekt 1 jest mniejszy, równy lub większy od obiektu 2?

Pełna dokumentacja: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html

 3
Author: Vinny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-06 21:20:17

Ten fragment kodu może być przydatny. Jeśli chcesz posortować obiekt w moim przypadku chcę sortować według VolumeName:

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;
}
To działa. Używam go w moim jsp.
 3
Author: Laura Liparulo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-04 11:29:42

Z tą biblioteką Tutaj {[3] } możesz sortować listę własnych obiektów na wielu kolumnach. Biblioteka korzysta z funkcji wersji 8.0. Próbka jest również dostępna tam. Oto przykład do zrobienia

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
Author: Shriram M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-26 18:06:12

Zapraszamy do zapoznania się z prezentacją , która odbędzie się na forum Java w Stuttgarcie w Niemczech w 2016 roku.

Tylko kilka slajdów używa języka niemieckiego, 99% zawartości to" angielski " kod źródłowy Javy; jak

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

Gdzie OurCustomComparator używa domyślnych metod (i innych ciekawych pomysłów). Jak pokazano, co prowadzi do bardzo zwięzłego kodu, aby wybrać jakąś metodę gettera do sortowania; i super proste łańcuchowanie (lub odwracanie) kryteriów sortowania.

Jeśli lubisz java8, znajdziesz wiele materiału na początek.

 3
Author: GhostCat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-20 12:49:37

New since 1.8 is a List.metoda sort() zamiast używania kolekcji.Sortuj() więc dzwonisz bezpośrednio do mylistcontainer.sort ()

Oto fragment kodu, który pokazuje listę.funkcja 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]

Klasa owoców to:

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   
 3
Author: Norbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-07 17:01:50

Wolę ten proces:

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

Jeśli lista obiektów ma właściwość o nazwie startDate, wywołujesz use this over and over. Możesz je nawet łańcuchować startDate.time.

To wymaga, aby twój obiekt był Comparable, co oznacza, że potrzebujesz compareTo, equals, i hashCode implementacja.

Tak, może być szybciej... Ale teraz nie musisz tworzyć nowego komparatora dla każdego rodzaju sortowania. Jeśli możesz zaoszczędzić czas dewelopera i zrezygnować z trybu runtime, możesz wybrać ten.
 1
Author: DDus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-06 23:43:30

Cóż, jeśli używasz Java 8 lub starszej wersji tutaj jest najlepsze rozwiązanie.

Collections.sort(studentList, Comparator.comparing(Student::getCgpa).reversed().thenComparing(Student:: getFname).thenComparing(Student::getId));

W tym przypadku najpierw sortuje za pomocą 'getCgpa', a w drugiej części sortuje za pomocą getFname i getId. Czyli pole do klasy pojo.

 1
Author: Kishan Bheemajiyani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-17 01:01:15

Użycie Javy 8 może zdefiniować Comparator w jednej linii używając Comparator.comparing()

Użyj jednego z następujących sposobów:

Opcja 1:

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

Opcja 2:

Collections.sort(listToBeSorted, Comparator.comparing(CustomObject::getStartDate));
 0
Author: Sahil Chhabra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 09:36:10

Twoja klasa niestandardowa może zaimplementować interfejs" porównywalny", który wymaga implementacji metody CompareTo. W metodzie CompareTo można zdefiniować, co to znaczy, że obiekt jest mniejszy lub większy od innego obiektu. Więc w twoim przykładzie może to wyglądać mniej więcej tak:

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

Liczba ujemna oznacza, że Ten {[10] } jest mniejszy niż obiekt, z którym jest porównywany. Liczba dodatnia oznacza, że to jest większa niż w porównaniu do obiektu, a Zero oznacza, że obiekty są równe.

Możesz następnie użyć kolekcji.Sortuj (myList), aby posortować listę bez konieczności podawania w komparatorze. Ta metoda ma również tę zaletę, że rzeczy są sortowane automatycznie, jeśli używasz posortowanych struktur danych kolekcji, takich jak zestaw drzew lub Mapa drzew.

Możesz sprawdzić ten artykuł, jeśli chcesz przeczytać więcej o porównywalnym interfejsie (ujawnienie: jestem autorem ;) ) https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/

 0
Author: Nullbeans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-15 06:39:42

Możesz również użyć Springs PropertyComparator Jeśli masz tylko ścieżkę właściwości String do (zagnieżdżonej) właściwości, którą chcesz posortować:

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

Wadą jest to, że ten komparator po cichu ignoruje właściwości, które nie istnieją lub nie są dostępne i obsługuje to jako null wartość dla porównania. Oznacza to, że powinieneś dokładnie przetestować taki komparator lub jakoś zweryfikować istnienie ścieżki właściwości.

 0
Author: xtermi2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-30 13:36:10

Używając API java-8 stream można sortować ArrayList Według:

 Comparator<Person> birthdayComparator = Comparator.comparing(Person::getBirthday);
 List<Person> sortedList = list.stream().sorted(birthdayComparator).collect(toList());
 0
Author: pero_hero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-09 20:33:29

Próbowałem wielu różnych rozwiązań dostępnych w Internecie, ale rozwiązanie, które działa dla mnie, jest dostępne pod poniższym linkiem.

Https://www.java67.com/2017/07/how-to-sort-arraylist-of-objects-using.html

 0
Author: The EasyLearn Academy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-21 03:12:18