按字段排序对象数组

8
我有一些对象。
Person{
    String name;  
    int age;
    float gradeAverage;
    }

有没有简单的方法来排序

Person[] ArrayOfPersons

按年龄排序?

我是否必须使用Comparable或Comparator?我不是很理解它们。


3
可能是如何在Java中对对象数组(Points)进行排序?的重复问题。 - BackSlash
我认为Java 7 (Net Beans 7.4)。 - user345280
你需要想出一种比较两个 Person 的方法;通常的方式是让 Person 实现 Comparable<Person> 或编写一个 Comparator<Person>。它们将用于比较人。 - Elliott Frisch
5个回答

28

为了完整起见,当使用Java 8时,您可以使用Comparator.comparing来创建某个属性的简单比较器,例如Comparator.comparing(Person::getAge)或者使用lambda表达式,例如Comparator.comparing(p -> p.age),如果没有获取年龄的方法。

这使得将不同属性的比较器进行链接变得特别容易,使用thenComparing,例如首先按照年龄排序,然后按照名称排序以防止出现平局:

Comparator.comparing(Person::getAge).thenComparing(Person::getName)

结合使用 Arrays.sort,任务就完成了。

Arrays.sort(arrayOfPersons, Comparator.comparing(Person::getAge));

继续保持,我真的很高兴看到那些厉害的人在Java 8中使用函数式编程特性 :) - Abdelrahman Elkady
使用比较器也更加灵活(例如,如果您想根据 UI 输入在不同字段上进行排序),因为您可以拥有多个比较器。 - spudone

6
你可以在循环中使用getter来检查年龄。
for (int i = 0 ; i < persons.length - 1; i++) {
    Person p = persons[i];
    Person next =  persons[i+1];
    if(p.getAge() > next.getAge()) {
        // Swap
    }
}

然而,实现Comparable是一种方便的方式。
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 ;
    }
}

您可以查看Comparable文档。

4
你可以实现Comparable接口使你的类具有可比性。请确保覆盖compareTo方法。
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
}

4
我经常混淆何时返回“-1”和何时返回“+1”,因此我更喜欢使用“return Integer.compare(this.age,p.getAge())”。这样更短,而且无论如何都是正确的。 - tobias_k

0

是的,只需实现Comparable接口即可。

这里有一个例子:

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

真的。谢谢你 :) - Michael Humelsine

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接