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

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

        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);
		}
<span style="white-space:pre">		</span>//以下这一行在编译的时候会给出如后图给出的警告,我暂时也不知到怎么处理,希望大家指点指点
		Arrays.sort(stuArray, new stuCompare());//同时传递数组和包含比较函数的对象
		
		System.out.println("排序后的数据");
		for (Student t : stuArray) {
			System.out.println(t);
		}
	}
}
警告如下:

Comparable:

// 该对象小于、等于或大于指定对象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);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值