比较器:进行大小关系的判断;
1、Arrays类
- 数组排序:java.util.Arrays.sort();
- 二分查找法:public static int binarySearch(数据类型[] a, 数据类型 key)
前提:数组必须是排序后的
public class TestDemo {
public static void main(String args[]) {
int data [] = new int [] {1, 5, 6, 2, 3, 4, 9, 8, 7, 10};
java.util.Arrays.sort(data); // 进行排序
System.out.println(Arrays.binarySearch(data, 9)); //8
}
}
- 数组比较:public static boolean equals(数据类型[] a, 数据类型[] a2)
判断数组是否相同,需要顺序完全一致
public class TestDemo {
public static void main(String args[]) {
int dataA [] = new int [] {1, 2, 3};
int dataB [] = new int [] {2, 1, 3};
int dataC [] = new int [] {1, 2, 3};
System.out.println(Arrays.equals(dataA, dataB));//false
System.out.println(Arrays.equals(dataA, dataC));//true
}
}
2、Comparable比较器
public class Book {
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public String to String() {
return "书名:" + this.title + " 价格:" + this.price;
}
}
public class TestDemo {
public static void main(String args[]) {
Book books [] = new Book [] {
new Book("Java开发", 79.8),
new Book("JSP开发", 69.8),
new Book("Oracle开发", 99.8),
new Book("Android开发", 89.8),
};
Arrays.sort(books); // 对象数组排序
System.out.println(Arrays.toString(books));
}
}
执行结果
Exception in thread "main" java.lang.ClassCastException:Book cannot be cast to java.lang.Comparable...
两个没有关系的类对象发生了强制性的转换。对象数组包含的编码(地址)比较是没意义的,应该按照价格排序才是有意义的,所以此处必须要明确设置出比较规则。
Comparable接口定义
public interface Comparable<T> {
public int compareTo(T o);
}
compareTo()方法返回三类数据:1(大于)、0(等于)、-1(小于)。
public class Book implements Comparable<Book> { // 实现比较
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
@Override
public String to String() {
return "书名:" + this.title + " 价格:" + this.price;
}
@Override
public int compareTo(Book o) { // Arrays.sort()会自动调用此方法比较
if(this.price > o.price) {
return 1;
} else if(this.price < o.price) {
return -1;
} else {
return 0;
}
}
}
public class TestDemo {
public static void main(String args[]) {
Book books [] = new Book [] {
new Book("Java开发", 79.8),
new Book("JSP开发", 69.8),
new Book("Oracle开发", 99.8),
new Book("Android开发", 89.8),
};
Arrays.sort(books); // 对象数组排序
System.out.println(Arrays.toString(books));
//[书名:JSP开发 价格:69.8, 书名:Java开发 价格:79.8, 书名:Android开发 价格:89.8, 书名:Oracle开发 价格:99.8]
}
}
compareTo()方法由Arrays.sort()自动进行调用。
不管何种情况下,只要是一组对象要排序,对象所在的类一定要实现Comparable接口。
3、Comparator比较器
- 在不修改Book类定义的情况下不能使用Comparable接口,又出现了另一个比较器:java.util.Comparator。
- 要实现的只有compare()方法,需要单独准备出一个类来实现Comparator接口,这个类将作为指定类的排序类。
定义排序工具类
public class BookComparator implements Comparator<Book> {
@Override
public int compare(Book o1, Book o2) {
if(o1.getPrice() > o2.getPrice()) {
return 1;
} else if(o1.getPrice() < o2.getPrice()) {
return -1;
} else {
return 0;
}
}
}
使用排序工具类
public class TestDemo {
public static void main(String args[]) {
Book books [] = new Book [] {
new Book("Java开发", 79.8),
new Book("JSP开发", 69.8),
new Book("Oracle开发", 99.8),
new Book("Android开发", 89.8),
};
Arrays.sort(books, new BookComparator()); // 对象数组排序
System.out.println(Arrays.toString(books));
}
}
比较Comparable和Comparator的区别:
Comparable | Comparator |
---|---|
java.lang.Comparable | java.util.Comparator |
类定义的时候实现 | 专门定义比较工具类 |
int compareTo() | compare()、equals() |
大多数使用 | 使用较少 |