自然排序Comparable
接口得使用举例:
1、像String
、包装类等实现了Comparable
接口,重写了compareTo()
方法,给出了两个对象大小;
2、像String
、包装类重写compareTo()
方法以后,进行了从小到大的排列
3、重写compareTo()
的规则:
如果当前对象this大于形参对象obj,则返回正整数,
如果当前对象this小于形参对象obj,则返回负整数,
如果当前对象this等于形参对象obj,则返回零。
4、对于自定义类,需要排序,可以用自定义类实现Comparable
接口,重写comparaTo()
方法。
代码:
package com.ComparableTest;
import org.junit.Test;
import java.util.Arrays;
public class CompareTest {
@Test
public void test1(){
String[] arr = new String[]{"AA","CC","MM","KK","GG","JJ","DD"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
@Test
public void test2(){
Goodss[] arr = new Goodss[5];
arr[0] = new Goodss("lianxiangMouse",34);
arr[1] = new Goodss("dellMouse",43);
arr[2] = new Goodss("xiaomiMouse",12);
arr[3] = new Goodss("huaweiMouse",65);
arr[4] = new Goodss("microsoftMouse",43);
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
package com.ComparableTest;
public class Goodss implements Comparable{
private String name;
private double price;
public Goodss() {
}
public Goodss(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
@Override
public String toString() {
return "Goodss{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
// 指明商品比较大小的方式
@Override
public int compareTo(Object o) {
if(o instanceof Goodss){
Goodss goods = (Goodss)o;// 输入的所有对象都是Object类或者其子类
if(this.price > goods.price) {
return 1;
}else if (this.price < goods.price) {
return -1;
}else{
return this.name.compareTo(goods.name);// 相等按字母排序
}
}
throw new RuntimeException("传入数据类型一致");
}
}
注意构造器和get
、toString
等方法的快捷生成。
定制排序:
1、背景:当元素的类型没有实现java.lang.Comparable
接口而又不方便修改代码, 或者实现了java.lang.Comparable
接口的排序规则不适合当前的操作,那 么可以考虑使用Comparator
的对象来排序。
2、 重写compare(Object o1,Object o2)
方法,比较01和o2的大小:
相等返回0;01大返回正正是,01小返回负整数。
代码:
@Test
public void test4(){
Goodss[] arr = new Goodss[5];
arr[0] = new Goodss("lianxiangMouse",34);
arr[1] = new Goodss("dellMouse",43);
arr[2] = new Goodss("xiaomiMouse",12);
arr[3] = new Goodss("huaweiMouse",65);
arr[4] = new Goodss("microsoftMouse",43);
Arrays.sort(arr,new Comparator(){
// 按产品名称从低到高,再按价格从高到低
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Goodss && o2 instanceof Goodss){
Goodss g1 = (Goodss) o1;
Goodss g2 = (Goodss) o2;
if(g1.getName().equals(g2.getName())) {
return -Double.compare(g1.getPrice(),g2.getPrice());
}else{
return g1.getName().compareTo(g2.getName());
}
}
throw new RuntimeException("输入的数据类型不一致");
}
});
System.out.println(Arrays.toString(arr));
}
两类接口对比:
Comparable接口的方式一旦指定,保证Comparable接口的实现类在任何位置都可以比较大小;
Coparator接口时临时性的比较