自然排序:
java.long.Comparable
1.Comparable接口的使用
- String、包装类 是实现了Comparable接口的,所以String是可以比较大小的
- 默认是从小到大进行排序(升序)
2.自定义类实现Comparable接口
- 需要排序时,要实现Comparable接口,重写compareTo().之后就可以使用Arrays.sort(Object obj)
- 重写comparableTo(obj) 方法的规范:
- 当前this大于obj那么返回正整数
- 当前this小于obj那么返回负整数
- 当前this等于obj那么返回0
3.特点:
- 多次使用
import java.util.Arrays;
public class ComparableTest {
public static void main(String[] args) {
ComparableTest comparableTest = new ComparableTest();
comparableTest.test1();
System.out.println("-------------------------------------------------");
Customize[] watch = new Customize[4];
watch[0]= new Customize("Apple Watch",2350);
watch[1]= new Customize("Mi Watch",1010);
watch[2]= new Customize("Oppo Watch",2100);
watch[3]= new Customize("HuaWei Watch",2500);
//自定义类需要排序时,要实现Comparable接口,重写compareTo()
Arrays.sort(watch); //排序
for (int i = 0; i < watch.length; i++) {
System.out.println(watch[i].toString());
}
}
//String 是实现了Comparable接口的,所以String是可以比较大小的
public void test1() {
String[] arr = new String[] {"bb","uu","t","jj","www","aa"};
System.out.println("排序前:"+Arrays.toString(arr));
Arrays.sort(arr); //排序
System.out.println("默认升序排序后:"+Arrays.toString(arr));
}
}
class Customize implements Comparable{
private String name;
private double price;
public Customize() {
super();
}
public Customize(String name, double price) {
super();
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "[name=" + name + ", price=" + price + "]";
}
@Override
//自定义类 要实现Comparable接口,重写compareTo()
public int compareTo(Object o) {
if (o instanceof Customize) {
Customize goods = (Customize) o;
if (this.price > goods.price) {
return 1;
} else if (this.price < goods.price) {
return -1;
} else {
return 0;
}
}
throw new RuntimeException("obj not instanceof Customize");
/* 或者
return Double.compare(this.price, goods.price); 升序
return -Double.compare(this.price, goods.price); 降序
*/
}
}
定制排序:
java.util.Comparator
Comparator接口的使用:
1.适用条件
- 当元素的类型没有实现java.long.Comparable接口,但是又不方便改代码(例如:java中内嵌的API)
- 实现了java.long.Comparable接口,但是排序的规则不适合当前的操作
2.Comparator接口的使用
- 重写compare(Object o1,Object o2)方法,比较o1和o2的大小
- 规范:
- o1大于o2那么返回正整数
- o1小于o2那么返回负整数
- o1等于o2那么返回0
3.特点
- 一次性使用
import java.util.Arrays;
import java.util.Comparator;
public class ComparatorTest {
public static void main(String[] args) {
ComparatorTest c1 = new ComparatorTest();
c1.test2();
System.out.println("**************************************");
Customize2[] watch = new Customize2[4];
watch[0]= new Customize2("Apple Watch",2350);
watch[1]= new Customize2("Mi Watch",1010);
watch[2]= new Customize2("Oppo Watch",2100);
watch[3]= new Customize2("HuaWei Watch",2500);
//自定义类使用 Comparator接口
Arrays.sort(watch, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Customize2 && o1 instanceof Customize2) {
Customize2 goods1 = (Customize2)o1;
Customize2 goods2 = (Customize2)o2;
return - Double.compare(goods1.getPrice(),goods2.getPrice()); //降序
}
throw new RuntimeException("o1 not instanceof Customize2 or o2 not instanceof Customize2");
}
});
for (int i = 0; i < watch.length; i++) {
System.out.println(watch[i].toString());
}
}
public void test2() {
String[] arr = new String[] {"bb","uu","t","jj","www","aa"};
System.out.println("排序前:"+Arrays.toString(arr));
Arrays.sort(arr, new Comparator(){ //Comparator接口的使用
@Override
public int compare(Object o1, Object o2) {//重写compare(Object o1,Object o2)方法
if(o1 instanceof String && o2 instanceof String) {
String s1 = (String)o1;
String s2 = (String)o2;
return -s1.compareTo(s2); //降序
}
throw new RuntimeException("o1 not instanceof String or o2 not instanceof String");
}
});
System.out.println("自定义降序排序后:"+Arrays.toString(arr));
}
}
class Customize2 {
private String name;
private double price;
public Customize2() {
super();
}
public Customize2(String name, double price) {
super();
this.name = name;
this.price = price;
}
public double getPrice() {
return price;
}
@Override
public String toString() {
return "[name=" + name + ", price=" + price + "]";
}
}