I have objects
Person{
String name;
int age;
float gradeAverage;
}
Is there an easy way to sort
Person[]
You can implement the Comparable interface to make your class comparable. Make sure to override the compareTo method then.
public class Person implements Comparable<Person> {
String name;
int age;
float gradeAverage;
@Override
public int compareTo(Person p) {
if(this.age < p.getAge()) return -1;
if(this.age == p.getAge()) return 0;
//if(this.age > p.getAge()) return 1;
else return 1;
}
//also add a getter here
}
You can check for age using a getter in your loop
for (int i = 0 ; i < persons.length - 1; i++) {
Person p = persons[i];
Person next = persons[i+1];
if(p.getAge() > next.getAge()) {
// Swap
}
}
However implementing Comparable is the convenient way
class Person implements Comparable<Person> {
String name;
int age;
float gradeAverage;
public int compareTo(Person other) {
if(this.getAge() > other.getAge())
return 1;
else if (this.getAge() == other.getAge())
return 0 ;
return -1 ;
}
public int getAge() {
return this.age ;
}
}
You can check Comparable documentation also
Just for completeness, when using Java 8, you can use Comparator.comparing to create a simple comparator for some attribute, e.g. Comparator.comparing(Person::getAge)
, or using lambda, like Comparator.comparing(p -> p.age)
, if there is not getter method for the age.
This makes it particularly easy to chain comparators for different attributes, using thenComparing, e.g. for sorting primarily by age, and then by name in case of ties:
Comparator.comparing(Person::getAge).thenComparing(Person::getName)
Combine that with Arrays.sort, and you are done.
Arrays.sort(arrayOfPersons, Comparator.comparing(Person::getAge));
import java.util.Arrays;
public class PersonCompare {
public static void main(String[] args) {
Person p1 = new Person("Test1",10);
Person p2 = new Person("Test2",12);
Person p3 = new Person("Test3",4);
Person p4 = new Person("Test4",7);
Person[] ArrayOfPersons = {p1,p2,p3,p4};
Arrays.sort(ArrayOfPersons);
for(Person p: ArrayOfPersons) {
System.out.println(p.getName()+"--"+p.getAge());
}
}
}
class Person implements Comparable<Person> {
String name;
int age;
Person(String name, int age){
this.name=name; this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Person other) {
if(this.getAge() > other.getAge())
return 1;
else if (this.getAge() == other.getAge())
return 0 ;
return -1 ;
}
}
Yes just implement the Comparable
interface.
Here's an example :
class Person implements Comparable<Person> {
public int age;
public String name;
public int compareTo(Person other){
return this.age == other.age ? 0 : this.age > other.age ? 1 : -1;
}
}