java使用Comparator与Comparable接口对对象排序

时间:2022-08-11 02:50:49
编程中可能常常要对一个对象数组 排序,对象中往往都有多个属性,一般使用中会对对象按其中的某一个属性值 排序 实现按其中一个属性 排序的方式有多中,最最直接的就是直接在写 排序算法的时候用对象中的一个属性值做比较

java的数组中提供了sort方法,假如我们要对一个普通的整形数组a排序可以直接写上Arrars.sort(a),然后输出的数组就是拍好序的数组了,默认的排序方式是升序的。应为java能够对整数做出大小的判断,所以,我们不需要给sort函数的参数做任何处理,或者是对数组处理。但是如果是要对一个对象数组排序,系统是不知道怎么去比较这两个对象的大小,所以我们就要在类中定义一个比较函数给sort排序函数用来做对象间的大小比较。于是就要用到Comparator或者Comparable接口了。

Comparator与Comparable的最直观区别在于Comparator需要传入两个对象作为参数,需要添加一个类;而Comparable的参数只要一个对象,直接在类中添加比较模块的代码。

Comparator:

//o1小于、等于或大于o2,分别返回负整数、零或正整数。
int compare(Object o1, Object o2);
示例代码:

import java.util.*;

class Student {
private String stuNum;
private int score;

public Student(String stuNum, int score) {
this.stuNum = stuNum;
this.score = score;
}

public int getScore() {
return score;
}

public String toString() {
return "学号: " + this.stuNum + " 成绩: " + this.score;
}
}

class stuCompare implements Comparator {//单独定义类实现接口
public int compare(Object a, Object b) {
return ((Student)a).getScore() - ((Student)b).getScore();
}
}

public class example1 {
public static void main(String[] args) {
final int MAX = 10;
Student[] stuArray = new Student[MAX];

for (int i = 0; i < MAX; i++) {
stuArray[i] = new Student(String.valueOf(i), (int)(Math.random()*100));
}

System.out.println("原始数据");
for (Student t : stuArray) {
System.out.println(t);
}
//以下这一行在编译的时候会给出如后图给出的警告,我暂时也不知到怎么处理,希望大家指点指点
Arrays.sort(stuArray, new stuCompare());//同时传递数组和包含比较函数的对象

System.out.println("排序后的数据");
for (Student t : stuArray) {
System.out.println(t);
}
}
}
警告如下:

java使用Comparator与Comparable接口对对象排序

Comparable:<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">// 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。    int compareTo(Object o);
示例代码:

import java.util.*;

class Student implements Comparable {//注意区别
private String stuNum;
private int score;

public Student(String stuNum, int score) {
this.stuNum = stuNum;
this.score = score;
}

public int getScore() {
return score;
}

public int compareTo(Object a) {//在类中添加比较函数
return this.score - ((Student)a).score;
}

public String toString() {
return "学号: " + this.stuNum + " 成绩: " + this.score;
}
}

public class example1 {
public static void main(String[] args) {
final int MAX = 10;
Student[] stuArray = new Student[MAX];

for (int i = 0; i < MAX; i++) {
stuArray[i] = new Student(String.valueOf(i), (int)(Math.random()*100));
}

System.out.println("原始数据");
for (Student t : stuArray) {
System.out.println(t);
}

Arrays.sort(stuArray);//排序时只传入数组

System.out.println("排序后的数据");
for (Student t : stuArray) {
System.out.println(t);
}
}
}
当然如果我们自己写写 排序函数的话,就不用考虑那么多了,直接在 排序算法中写入相关属性就能 排序,以下用冒泡 排序对对象 排序

示例代码:

import java.util.*;

class Student {
private String stuNum;
private int score;

public Student(String stuNum, int score) {
this.stuNum = stuNum;
this.score = score;
}

public int getScore() {
return score;
}

public String toString() {
return "学号: " + this.stuNum + " 成绩: " + this.score;
}
}

public class example1 {
public static void main(String[] args) {
final int MAX = 10;
Student[] stuArray = new Student[MAX];

for (int i = 0; i < MAX; i++) {
stuArray[i] = new Student(String.valueOf(i), (int)(Math.random()*100));
}

System.out.println("原始数据");
for (Student t : stuArray) {
System.out.println(t);
}

for (int i = 0; i < MAX - 1; i++) {
for (int j = 0; j < MAX - i - 1; j++) {
if (stuArray[j].getScore() > stuArray[j + 1].getScore()) {
Student temp = stuArray[j];
stuArray[j] = stuArray[j + 1];
stuArray[j + 1] = temp;
}
}
}

System.out.println("排序后的数据");
for (Student t : stuArray) {
System.out.println(t);
}
}
}