Sorting array of objects by field

2020-04-11 11:28发布

I have objects

Person{
    String name;  
    int age;
    float gradeAverage;
    }

Is there an easy way to sort

Person[] ArrayOfPersons

by age?

Do I have to use Comparable or Comparator? I don't fully understand them.

5条回答
▲ chillily
2楼-- · 2020-04-11 11:51

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
}
查看更多
Juvenile、少年°
3楼-- · 2020-04-11 12:00

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));
查看更多
4楼-- · 2020-04-11 12:02
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 ;
}
}
查看更多
Rolldiameter
5楼-- · 2020-04-11 12:06

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

查看更多
走好不送
6楼-- · 2020-04-11 12:09

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;
    }
}
查看更多
登录 后发表回答