算法与数据结构-排序函数

对于各种基本数据类型的一维数组的排序,我们通常可以使用Java中自带的sort函数对其进行排序。

public static void main(String[] args) {
	char[] a = {'a','v','d','o'};
	Arrays.sort(a);
    System.out.println(Arrays.toString(a));
}

然而对于自定义数据类型的排序,我们通常要继承Comparable接口,或者Comparator接口,来实现排序。

Comparable接口

Comparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。接口中通过x.compareTo(y)来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。

继承Comparable接口的类,是需要覆写compareTo函数的。

public class test {
    public static void main(String[] args) {
        Job job1 = new Job(1, 1);
        Job job2 = new Job(2, 1);
        Job[] job = {job1, job2};
        Arrays.sort(job);
        System.out.println(Arrays.toString(job));
    }
}

class Job implements Comparable<Job> {
	int s;
	int t;

	public Job(int s, int t) {
		this.s = s;
		this.t = t;
	}

	@Override
	public int compareTo(Job other) {
		int x = this.t - other.t;
		if (x == 0) {
			return this.s - other.s;
		}else {
			return x;
		}
	}
}

对于上面的程序,如果我们需要对一个Job类型数组进行排序,就可以使用函数Arrays.sort(Object[] object)实现。

注意:

  • Comparable接口是实现对自定义类型数组的排序。

Comparator接口

Comparator 是比较器接口。我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。

继承Comparator接口是需要实现compare函数的。

private static class edge {
	public int a;// 起点
	public int b;// 终点
	public int value;// 权值

	public edge(int a, int b, int value) {
		this.a = a;
		this.b = b;
		this.value = value;
	}
}

private static class MyComparator implements Comparator<edge> {
	public int compare(edge o1, edge o2) {
		if (o1.value > o2.value)
			return 1;
		else if (o1.value < o2.value)
			return -1;
		return 0;
	}
}

对于上面的程序,如果我们需要对一个list集合进行排序,我们通常可以使用函数Collections.sort(List list, new MyComparator());

当然对于上面的程序,我们也可以改成用一个匿名内部类的形式来表达。

// 该匿名内部类可以写在一个函数内,直接替代MyComparator类和排序函数
Collections.sort(list, new Comparator<edge>() {
	public int compare(edge o1, edge o2) {
		return o1.value - o2.value;
	}
});

注意:

  • Comparator接口是对自定义类型的集合进行排序

  • Comparator接口的实现是在类的外部(意思就是在自定义类的外部,再创建一个类。除非使用匿名内部类)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值