排序语句的使用
初转java,很多操作都要重新学习java的版本。比如今天的主角:排序语句。
在程序设计过程中,排序算法是最常用到的算法之一,正是因为其经常用到,所以掌握利用已经设计好的算法语句,会大大提升程序设计过程中的效率。主要优点如下:
- 进行排序仅需要一句话,方便书写
- 设计好的算法,确保正确率
- 算法出自高手,保证运行效率
那么与C语言qsort和sort不同的是,JAVA语言中并不存在孤立的方法,所有的方法都在类中。所以,今天的主角sort函数,就出现在数组类Array中。
它的调用方式为:
Arrays.sort(Object[] o,int );
括号中,传递需要排序的数组,默认为升序排序。
那么这里就会产生几个问题
- 默认顺序为升序,想要降序该怎么办?
- 对象数组可以进行排序吗?
回答
在回答问题之前,我有必要引入两个十分相似的接口,comparable,comparator接口。
对象实现这两个接口,分别成为可比较对和比较器对象。
可比较对象
当一个类继承了Comparable接口并实现了CompareTo方法,那么该类实例化出的对象即为可比较对象。这个对象可与其它对象进行大小的比较。
比较器对象
当一个类继承了Comparator接口并实现了Compare方法,那么该类实例化出的对象即为比较器对象。这个对象可比较两个对象的大小。
贴一段代码举例:
class Person implements Comparable<Person>
{
int age;
Person(int age)
{
this.age = age;
}
public int compareTo(Person o) {
return this.age - o.age;
}
}
class Judge implements Comparator<Person>
{
String name;
Judge(String name)
{
this.name = name;
}
public int compare(Person o1, Person o2) {
return o2.age - o1.age;
}
}
在这一段代码中,Person类是可比较类,Judge类是比较器类
扫描二维码关注公众号,回复:
9662156 查看本文章
有了这样的铺垫,我就可以开始回答问题了。
问:默认顺序为升序,想要降序该怎么办?
答:想要获得降序排列,就必须为方法提供比较器,在比较器中重新定义比较规则。
默认排序算法中比较大小的方式是前者与后者运算使两者相减
为负则小
为零则等
为正则大
故可以重写比较器方法,让结果值取相反数,即可使数组降序。
相对应的,调用方法需改为:
Arrays.sort(数组,比较器对象);
比较方法写成:
public int compare(int a,int b)
{
return b - a;
}
问:对象数组可以进行排序吗?
答:当然可以,有两种方法
- 方法1:上一个问题中,我们提到了比较器对象在排序方法中的使用。对于对象数组,比较器的调用方式依旧适用。此时,我们的比较器的便需要可以比较对象大小。
利用上文的两个类举例。比较器类Judge实现了比较方法,可以用来比较两个Person类对象。
这时,我们实例化一个Person类对象数组person,再实例化一个Judge类对象judge便可使用语句进行排序了。写法:
Array.sort(person,judge);
- 方法2:对象数组也可以像一般数组一样不通过比较器进行排序。不过这要求对象之间可进行大小比较。所以只需要我们让类实现Comparable接口,这样我们的对象就成了可比较对象,就可以参与排序了。
笔者水平有限,如有错误之处,欢迎指出