Java使用Arrays.sort()方法给对象排序 - Go语言中文社区

Java使用Arrays.sort()方法给对象排序


当我们给一个整型数组或者浮点型之类的数组排序的时候,很简单就可以达到我们排序的目的,无非是排序算法的问题。那么,如果我们现在想根据对象的一个属性值给一个对象数组进行排序呢?

假如我们现在有一个Car类型,Car类中有一个double型的speed属性用来描述车辆的速度,现在我们想根据车速来对一个Car数组中的车辆进行排序,怎么做呢?

public class Car{
	private double speed;//车辆的速度属性

	public Car(double speed) {
		this.speed = speed;
	}

	public double getSpeed() {
		return speed;
	}

	public void setSpeed(double speed) {
		this.speed = speed;
	}	
}

麻烦的方法

我们可以通过比较对象的属性值,根据比较结果,对对象数组进行排序,例如,假如我们使用的是冒泡排序的话,就需要写成下面这样:

for(int i=0;i<a.length-1;i++)//a为一个存储了很多Car对象的数组
{
	for(int j=0;j<a.length-i-1;j++)
	{
		if(a[j].getSpeed()>a[j+1].getSpeed())//交换操作
		{
			Car temp=a[j];
			a[j]=a[j+1];
			a[j+1]=temp;
		}
	}
}

这样写确实能实现了效果,但是未必性能很好,由于是自己写的,写起来也会比较麻烦,下面的方法会更好

Arrays.sort()方法

我们先来看看用Array.sort()方法实现对车辆排序的代码:
其中,Car这个类有两种写法:

第一种写法:

public class Car implements Comparable<Car>{
	private double speed;

	public Car(double speed) {
		this.speed = speed;
	}

	public double getSpeed() {
		return speed;
	}

	public void setSpeed(double speed) {
		this.speed = speed;
	}

	@Override
	public int compareTo(Car newCar) {
		return Double.compare(this.getSpeed(),newCar.getSpeed());
	}	
}

第二种写法

public class Car implements Comparable{
	private double speed;

	public Car(double speed) {
		this.speed = speed;
	}

	public double getSpeed() {
		return speed;
	}

	public void setSpeed(double speed) {
		this.speed = speed;
	}

	@Override
	public int compareTo(Object newCar) {
		return Double.compare(this.getSpeed(),((Car)newCar).getSpeed());
	}	
}

main方法:

public class Test8 {
	public static void main(String[] args) {
		Car[] carList = new Car[3];
		carList[0] = new Car(30);
		carList[1] = new Car(10);
		carList[2] = new Car(55);
		Arrays.sort(carList);
		
		for(Car c:carList)
		{
			System.out.println(c.getSpeed());
		}
	}
	
}

输出结果:
在这里插入图片描述

解析:

顾名思义,Arrays类的sort()方法是对一个数组进行排序的方法,sort()方法的参数是一个对象数组,也就是要排序的那个数组,但是有些特别的是,这个对象数组中存储的对象的类必须实现了Comparable接口。

Comparable接口是用来比较大小的,要实现这个接口,我们必须重写接口中的CompareTo()方法,这个方法用来比较两个对象的大小,因为方法本身并不知道我我们会根据对象的哪个属性来比较两个对象的大小,因此在这个方法中,我们可以定义我们自己的比较规则。

在上述的代码中,我们调用了Double类的比较方法来比较两个对象的speed属性的大小,如果调用方法的Car对象的speed属性值比方法参数传进来的Car对象的speed值大就返回1,相等就返回0,小于就返回-1。当然,我们也可以自己手写这个部分,无非就是if else判断的事。

之所以有两种写法,是因为第一种使用了泛型,第二种使用了对象的强制转换,可以看到,当我们使用泛型的时候,在调用对象的时候就已经确定了使用接口的时候用的是哪一种对象,因此就不用把对象类型强制转换为我们想要的类型了。而第二种我们没有使用泛型,因此就需要把参数传进来的对象强制转换成我们想要的类型然后再进行操作。推荐使用第一种写法。

接下来,我们在main方法中构建了一个Car类型的数组,然后直接调用Arrays.sort()方法传进数组作为参数就可以对数组进行排序了。

这种方法比较方便,快捷,在性能方面也有不错的表现,本人亲测在排序20万个对象的时候花费差不多200ms左右的时间。

当然,这种方法主要图的是方便,当我们需要排序大量的数据的时候,还是应该结合自己数据的特性来具体选择一种排序方式自己写。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_37856300/article/details/84940888
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢