按字段对对象数组进行排序
Sorting array of objects by field
我有对象
Person{
String name;
int age;
float gradeAverage;
}
有没有简单的排序方法
Person[] ArrayOfPersons
按年龄?
我必须使用 Comparable 或 Comparator 吗?我不是很懂。
是的,只需实现 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;
}
}
您可以实现 Comparable 接口,使您的 class 具有可比性。然后确保重写 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
}
您可以在循环中使用 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
文档
只是为了完整性,当使用 Java 8 时,您可以使用 Comparator.comparing
为某些属性创建一个简单的比较器,例如Comparator.comparing(Person::getAge)
,或使用 lambda,如 Comparator.comparing(p -> p.age)
,如果年龄没有 getter 方法。
这使得链接比较器特别容易用于不同的属性,使用thenComparing
,例如主要按年龄排序,然后在领带的情况下按姓名排序:
Comparator.comparing(Person::getAge).thenComparing(Person::getName)
将它与 Arrays.sort
结合起来,你就完成了。
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 ;
}
}
我有对象
Person{
String name;
int age;
float gradeAverage;
}
有没有简单的排序方法
Person[] ArrayOfPersons
按年龄?
我必须使用 Comparable 或 Comparator 吗?我不是很懂。
是的,只需实现 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;
}
}
您可以实现 Comparable 接口,使您的 class 具有可比性。然后确保重写 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
}
您可以在循环中使用 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
文档
只是为了完整性,当使用 Java 8 时,您可以使用 Comparator.comparing
为某些属性创建一个简单的比较器,例如Comparator.comparing(Person::getAge)
,或使用 lambda,如 Comparator.comparing(p -> p.age)
,如果年龄没有 getter 方法。
这使得链接比较器特别容易用于不同的属性,使用thenComparing
,例如主要按年龄排序,然后在领带的情况下按姓名排序:
Comparator.comparing(Person::getAge).thenComparing(Person::getName)
将它与 Arrays.sort
结合起来,你就完成了。
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 ;
}
}