一.Comparable接口
1.1字符串类型String
调用Arrays工具类的sort()方法进行从小到大排序
@Test
public void text(){
String str[]={"Jeeory","Lisa","Petter","Hanleilei"};
Arrays.sort(str);//这里调用了Arrays工具类的sort方法,从小到大排序
//输出排序后的结果
for (int i=0;i<str.length;i++)
{
System.out.println(str[i]);
}
System.out.println(str[0].compareTo(str[1]));
}
运算结果:
在上述代码中的最后一行调用了compareTo()方法,该方法为Comparable接口的实现方法,在String类中实现了Comparable接口。当当前对象小于所传对象时,返回负数,返回0时说明相等,返回正数说明当前对象大于所传对象。对于字符串的比较,本质上是对ASCII码和Unicode码的比较。
1.2自然排序方式(Comparable)
首先定义了一个Develop类,里面有name、age成员变量。
接下来是代码部分:
@Test
public void text1(){
Developer developer[]=new Developer[3];
developer[0]=new Developer("王五",21);
developer[1]=new Developer("李华",19);
developer[2]=new Developer("张三",21);
Arrays.sort(developer);
for (int i=0;i<developer.length;i++)
{
System.out.println(developer[i].getName()+" "+developer[i].getAge());
}
System.out.println(developer[0].compareTo(developer[1]));
}
此时利用Arrays.sort ()时出现了类型转换异常,报错信息为Develop类不能转换Comparable。原因是Develop类未实现Comparable接口。
解决方法:Develop类实现Comparable接口中的抽象方法
如:实现年龄的从小到大排序
/* Arrays.sort方法是java中用于对数组元素进行自然排序的方法。 当调用Arrays.sort方法时,它使用数组的自然排序,这要求数组元素的类型实现了Comparable接口。 排序算法会根据compareTo方法的实现来确定元素的个数。 如果你的自定义类实现了Comparable接口,Arrays.sort方法会根据所实现的CompareTo方法来对元素排序。 默认情况下,CompareTo方法应该返回负值、零或正值,表示当前对象小于、等于或大于传入的对象。当Arrays.sort 调用compareTo方法时,它就能够根据返回值来进行排序,从小到大或者从大到小都是有可能的,具体取决于compareTo 的实现。 */
@Override
public int compareTo(Object o) {
if (o==this)//判断是否为当前对象
{
return 0;
}
if (o instanceof Developer)
{
Developer developer=(Developer)o;
return Integer.compare(this.age,developer.age);//返回值前加-号是相反的排列顺序
}
throw new RuntimeException("类型不匹配");
}
程序运行结果:
二.Comparator接口
2.1自制排序
@Test
public void text2(){
Phone phone[]=new Phone[3];
phone[0]=new Phone("HUAWEI",5999);
phone[1]=new Phone("IPHONE",8999);
phone[2]=new Phone("OPPO",4999);
/*
这里实现的是comparator的匿名接口
compartor的优势是需要什么排序就可以直接定义,比较灵活
自然排序可以利用comparable接口来实现,如商品排序会有一个默认的
排序方式,用户所选择的排序方式可以利用comparator接口实现,一般会用
匿名的实现类。
*/
Arrays.sort(phone, new Comparator<Phone>() {
@Override
public int compare(Phone o1, Phone o2) {
if (o1 instanceof Phone&&o2 instanceof Phone)
{
return -Integer.compare(o1.getPrice(),o2.getPrice());
}
throw new RuntimeException("类型不匹配!");
}
});
for (int i=0;i<phone.length;i++)
{
System.out.println(phone[i].getBrand()+" "+phone[i].getPrice());
}
}
程序运行结果:
三.个人小结
3.1comparable接口实现
在类中实现compareTo方法,因为该方法是在类中实现,参数列表只有一个对象,所以方法体中首先判断所传对象是否为本对象,接着是定义自己的排序方式,同样也是首先判断所传对象是否为该类所实现的对象。最后可以手动抛出运行时异常来处理类型不匹配的情况。
3.2comparator匿名接口实现
因为这里是采用comparator接口的匿名实现方式,所以此处的排序方式需要在Arrays.sort方法中新new 一个comparator{},此处实现的是compare方法如下图:
自然排序可以利用comparable接口来实现,如商品排序会有一个默认的 排序方式,用户所选择的排序方式可以利用comparator接口实现,一般会用 匿名的实现类。