Sort objects arraylist java

Java ArrayList of Object Sort Example (Comparable & Comparator)

In this tutorial, you will learn how to sort an ArrayList of Objects by property using comparable and comparator interface. If you are looking for sorting a simple ArrayList of String or Integer then you can refer the following tutorials –

We generally use Collections.sort() method to sort a simple array list. However if the ArrayList is of custom object type then in such case you have two options for sorting- comparable and comparator interfaces.

What’s the need of comparable and comparator?

Before going through the example of sorting an ArrayList using comparable and comparator, let’s see what happens when we try to sort arraylist of Objects without implementing any of these interfaces. Consider the following example – We have a Student class which has properties like Student name, roll no and student age.

public class Student < private String studentname; private int rollno; private int studentage; public Student(int rollno, String studentname, int studentage) < this.rollno = rollno; this.studentname = studentname; this.studentage = studentage; >public String getStudentname() < return studentname; >public void setStudentname(String studentname) < this.studentname = studentname; >public int getRollno() < return rollno; >public void setRollno(int rollno) < this.rollno = rollno; >public int getStudentage() < return studentage; >public void setStudentage(int studentage) < this.studentage = studentage; >>

And I want to have an ArrayList of Student Object, which can be defined like this:

import java.util.*; public class ArrayListSorting < public static void main(String args[])< ArrayListarraylist = new ArrayList(); arraylist.add(new Student(223, "Chaitanya", 26)); arraylist.add(new Student(245, "Rahul", 24)); arraylist.add(new Student(209, "Ajeet", 32)); Collections.sort(arraylist); for(Student str: arraylist) < System.out.println(str); >> >

I tried to call the Collections.sort() on the List of Objects and boom! I got the the following error message:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: Bound mismatch: The generic method sort(List) of type Collections is not applicable for the arguments (ArrayList). The inferred type Student is not a valid substitute for the bounded parameter > at beginnersbook.com.Details.main(Details.java:11)

Reason: I Just called the sort method on an ArrayList of Objects which actually doesn’t work until unless we use interfaces like Comparable and Comparator .

Читайте также:  Python запуск кода из файла

Now you must have understood the importance of these interfaces. Let’s see how to use them to sort an ArrayList of objects.

Sorting of ArrayList with Comparable

Let’s say we need to sort the ArrayList based on the student Age property. This is how it can be done – First implement Comparable interface and then Override the compareTo method.

package beginnersbook.com; public class Student implements Comparable < private String studentname; private int rollno; private int studentage; public Student(int rollno, String studentname, int studentage) < this.rollno = rollno; this.studentname = studentname; this.studentage = studentage; >. //getter and setter methods same as the above example . @Override public int compareTo(Student comparestu) < int compareage=((Student)comparestu).getStudentage(); /* For Ascending order*/ return this.studentage-compareage; /* For Descending order do like this */ //return compareage-this.studentage; >@Override public String toString() < return "[ rollno=" + rollno + ", name=" + studentname + ", age=" + studentage + "]"; >>

Now we can very well call Collections.sort on ArrayList

import java.util.*; public class ArrayListSorting < public static void main(String args[])< ArrayListarraylist = new ArrayList(); arraylist.add(new Student(223, "Chaitanya", 26)); arraylist.add(new Student(245, "Rahul", 24)); arraylist.add(new Student(209, "Ajeet", 32)); Collections.sort(arraylist); for(Student str: arraylist) < System.out.println(str); >> >
[ rollno=245, name=Rahul, age=24] [ rollno=223, name=Chaitanya, age=26] [ rollno=209, name=Ajeet, age=32]

Comparable did our job why do we need Comparator anymore?
Since Comparable is implemented by the same class whose objects are sorted so it binds you with that sorting logic which is ok in most of the cases but in case you want to have more than way of sorting your class objects you should use comparators. Read more about them here:

Sorting ArrayList multiple properties with Comparator

We are overriding compare method of Comparator for sorting.

package beginnersbook.com; import java.util.Comparator; public class Student < private String studentname; private int rollno; private int studentage; public Student(int rollno, String studentname, int studentage) < this.rollno = rollno; this.studentname = studentname; this.studentage = studentage; >. //Getter and setter methods same as the above examples . /*Comparator for sorting the list by Student Name*/ public static Comparator StuNameComparator = new Comparator() < public int compare(Student s1, Student s2) < String StudentName1 = s1.getStudentname().toUpperCase(); String StudentName2 = s2.getStudentname().toUpperCase(); //ascending order return StudentName1.compareTo(StudentName2); //descending order //return StudentName2.compareTo(StudentName1); >>; /*Comparator for sorting the list by roll no*/ public static Comparator StuRollno = new Comparator() < public int compare(Student s1, Student s2) < int rollno1 = s1.getRollno(); int rollno2 = s2.getRollno(); /*For ascending order*/ return rollno1-rollno2; /*For descending order*/ //rollno2-rollno1; >>; @Override public String toString() < return "[ rollno=" + rollno + ", name=" + studentname + ", age=" + studentage + "]"; >>

ArrayList class:

package beginnersbook.com; import java.util.*; public class Details < public static void main(String args[])< ArrayListarraylist = new ArrayList(); arraylist.add(new Student(101, "Zues", 26)); arraylist.add(new Student(505, "Abey", 24)); arraylist.add(new Student(809, "Vignesh", 32)); /*Sorting based on Student Name*/ System.out.println("Student Name Sorting:"); Collections.sort(arraylist, Student.StuNameComparator); for(Student str: arraylist) < System.out.println(str); >/* Sorting on Rollno property*/ System.out.println("RollNum Sorting:"); Collections.sort(arraylist, Student.StuRollno); for(Student str: arraylist) < System.out.println(str); >> >
Student Name Sorting: [ rollno=505, name=Abey, age=24] [ rollno=809, name=Vignesh, age=32] [ rollno=101, name=Zues, age=26] RollNum Sorting: [ rollno=101, name=Zues, age=26] [ rollno=505, name=Abey, age=24] [ rollno=809, name=Vignesh, age=32]

Recommended Articles:

About the Author

I have 15 years of experience in the IT industry, working with renowned multinational corporations. Additionally, I have dedicated over a decade to teaching, allowing me to refine my skills in delivering information in a simple and easily understandable manner.

Comments

Hey sir. Why my netbeans says that student is not an abstract class and doesn’t override the methods from Comparator even i used same codes with yours

i had error when override the compareto method “method doesnot override or implement a method from a supertype” when i replace(object o )with (Student comparestu)

I am also facing the same error, even after i copy paste this same syntax. There is some problem with the way we are overriding the method.

yeah and once the type is mentioned, he doesn’t need to typecase inside the compareTo method coz he’s already getting the argument as Student.

GREAT explanation!
I have a question, how do you print out an object with the highest value of one of their properties.
Lets say, I want to print out the name of the student with the highest age from an array list of 100 students. how do you do that?

This is great for sorting by one field in a custom object. Can you advise on how to sort by multiple criteria? for example, sort by age then sort by name then…

@Dan and others who want to sort for multiple values like first by age then by name they could use this
suppose you have list of some objects , call these mehtods of sorting in order in which you want to sort the list
Collections.sort(list, new Comparator() @Override
public int compare(Campain lhs, Campain rhs) Date lhsDate = new Date();
Date rhsDate = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
try lhsDate = dateFormat.parse(lhs.getDatetime());
rhsDate = dateFormat.parse(rhs.getDatetime());
> catch (ParseException e) e.printStackTrace();
>
//return lhsDate.getTime() // if (rhsDate.getTime() == lhsDate.getTime())
// return 0;
// return rhsDate.getTime() < lhsDate.getTime() ? -1 : 1;
return rhsDate.compareTo(lhsDate);
>
>);
then calll this method again for sorting

Hi thanks for the awesome description. I want to ask something 1. Is comparable used only for sorting based on an integer property ?? because in other threads it can be used to sort string and other type as well and its working. 2. The code for the comparbles compareTO()method here is taking Student object as parameter, and its not working when i tried, although when passing only base Object type and than casting student from it works well. public int compareTo(Object obj) <
Student st=(Student)obj;

what if there 2 student with SAME NAME but different Roll no and want to sort according to name and then roll no ?

still the program ArrayListSorting will give an error :-
Student is not abstract and does not override the abstract method compareTo(Object) in Comparable.
so to remove this error change the line
public int compareTo(Student comparestu) from the Comparable program as :-
public int compareTo(Object comparestu) < this will make program execute. and output will come.
[ rollno=245, name=Rahul, age=24]
[ rollno=223, name=Chaitanya, age=26]
[ rollno=209, name=Ajeet, age=32]

Thank you so much.
I was trying to solve same problem since many day finally I did change accordingly your then it got executed.

You can also sort String type using Comparable. public int compareTo(Student st) <
return this.name.compareTo(st.name);
>

By Using Comparable interface .. You can sort on any field like name or tag etc… other than integer. Just change the implementation of compareTo method like @Override
public int compareTo(Student st) Student student = st;
return studentname.compareTo(student.getStudentName());
> and from main method you can call Collections.sort(Student); .. So what is main requirement of Comparator interface…

Thanks for explaining the topic. Just a little correction, As you highlighted, Using Comparable we can sort custom object only based on integer type. This is not correct, We can sort custom object on String base also, Like you shared Student Object above, having roll no, name and age, Let me show compareTo method performing sort based on String: public int compareTo(Student compareStudent) <
return this.name.compareTo(compareStudent.name);
> Above piece of code will sort Student object based on name (String Type).

Источник

How to Sort a List in Java

How to Sort a List in Java

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Sometimes we have to sort a list in Java before processing its elements. In this tutorial, we will learn how to sort a list in the natural order. We will also learn how to use our own Comparator implementation to sort a list of objects. Java List is similar to arrays except that the length of the list is dynamic and it comes in Java Collection framework. Actually, List is an interface and most of the time we use one of its implementation like ArrayList or LinkedList etc.

Java Sort List

Here we will learn how to sort a list of Objects in Java. We can use Collections.sort() method to sort a list in the natural ascending order. All the elements in the list must implement Comparable interface, otherwise IllegalArgumentException is thrown. Let’s look at a quick example to sort a list of strings.

package com.journaldev.sort; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class JavaListSort < /** * This class shows how to sort ArrayList in java * @param args */ public static void main(String[] args) < ListstrList = new ArrayList(); strList.add("A"); strList.add("C"); strList.add("B"); strList.add("Z"); strList.add("E"); //using Collections.sort() to sort ArrayList Collections.sort(strList); for(String str: strList) System.out.print(" "+str); > > 

Java Sort List

As you can see that we are using Collections.sort() method to sort the list of Strings. The String class implements Comparable interface. Output:

Java Sort List of Objects

Let’s see another example where we will sort a list of custom objects. Note that the class must implement Comparable interface.

package com.journaldev.sort; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class JavaSortListObject < public static void main(String[] args) < Listdl = new ArrayList<>(); dl.add(new Data(2)); dl.add(new Data(3)); dl.add(new Data(1)); System.out.println("Original List::"+dl); Collections.sort(dl); System.out.println("Naturally Sorted List::"+dl); > > class Data implements Comparable  < private int id; public Data(int i) < this.id = i; >@Override public int compareTo(Data d) < return this.id - d.getId(); >public int getId() < return id; >@Override public String toString() < return "Data"; > > 
Original List::[Data, Data, Data] Naturally Sorted List::[Data, Data, Data] 

Sort a List in Java using Comparator

Collections.sort() method is overloaded and we can also provide our own Comparator implementation for sorting rules. Since Comparator is a functional interface, we can use lambda expressions to write its implementation in a single line.

Collections.sort(dl, (d1, d2) -> < return d2.getId() - d1.getId(); >); System.out.println("Reverse Sorted List using Comparator::" + dl); 

Java Sort List Objects Comparator

Output:

Summary

Collections class sort() method is used to sort a list in Java. We can sort a list in natural ordering where the list elements must implement Comparable interface. We can also pass a Comparator implementation to define the sorting rules. You can checkout more examples from our GitHub Repository. Reference: API Doc

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases. Learn more about us

Источник

Оцените статью