TOC
前言: 我们知道C++中可以很轻松的根据结构体中的某一元素进行排序,但同样的问题到Java中该怎样实现呢?怎么根据Java中某一个类的某一个属性进行排序呢。有两种方法,一种是实现Comparable接口,另一种是构造比较器,我认为实现Comparable接口相对简单易懂,所以我决定记录这种方法。
我们以学生作为例子,学生类里有姓名,年龄,成绩几个属性,首先我们要根据成绩排名,在成绩相同的情况下,根据姓名排名,在姓名相同的情况下再根据年龄排名
1.先把学生类的代码块写出来,里面要包含get,set方法以便一会调用,或者直接写好toString方法,这里选择使用get,set方法。
class Student {
String name;
int age;
int cj;
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;
}
public int getCj() {
return cj;
}
public void setCj(int cj) {
this.cj = cj;
}
public Student(String name, int age, int cj) {
this.name = name;
this.age = age;
this.cj = cj;
}
}
}
2.继承Comparable接口,实现compareTo方法
class Student implements Comparable<Student> {
/**
*
*构造方法,属性等代码已省略
*
*/
@Override
public int compareTo(Student o) {
if (this.getCj() == o.getCj()) {
//这个地方注意使用equals比较字符串
if (this.getName().equals(o.getName())) {
//数据类型的要new Integer()
return new Integer(this.getAge()).compareTo(o.getAge());
}
//字符串类型的比较可以直接写
return this.getName().compareTo(o.getName());
}
return new Integer(this.getCj()).compareTo(o.getCj());
}
}
3.通过引入数据,把Student放在List容器中,再用Collections.sort()对容器进行遍历,最后遍历展示已经排好序的list
下面展示完整代码:
import java.util.*;
public class TestSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
List<Student> students = new ArrayList<>();
for (int i = 0 ; i < n; ++i){
String name = sc.next();
int age = sc.nextInt();
int cj = sc.nextInt();
students.add(new Student(name,age,cj));
}
Collections.sort(students);
for (Student student : students){
System.out.println(student.getName()+" "+student.getAge()+" "+student.getCj());
}
}
}
}
class Student implements Comparable<Student> {
String name;
int age;
int cj;
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;
}
public int getCj() {
return cj;
}
public void setCj(int cj) {
this.cj = cj;
}
public Student(String name, int age, int cj) {
this.name = name;
this.age = age;
this.cj = cj;
}
@Override
public int compareTo(Student o) {
if (this.getCj() == o.getCj()) {
//坑人
if (this.getName().equals(o.getName())) {
return new Integer(this.getAge()).compareTo(o.getAge());
}
return this.getName().compareTo(o.getName());
}
return new Integer(this.getCj()).compareTo(o.getCj());
}
}
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付