目录
Comparable接口
- “排序”的实体类都实现了java.lang.Comparable接口, Comparable接口中只有一个方法
public int compareTo(Object obj);
该方法:- 返回0 表示 this==obj
- 返回正数表示this>obj
- 返回负数表示this<obj
- 实现了 Comparable接口的类通过实现compareTo方法从而确定该类对象的排序方式
- Collections工具类,提供了大量便于处理容器的方法
引用数据类型:JDK提供的内置的引用数据类型、自定义的引用数据类型
多排序规则:
- 提供排序的比较器,业务比较器
实现iava.util.Comparator接口
重写 public int compare(T o1,T o2) - 作用:
解耦:独立于实体类
方便:便于应对各种排序规则
内置引用数据类型的比较
比较规则:
整数、小数:根据基本数据类型大小
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
} //int、float、double
字符:根据Unicode编码排序
public static int compare(char x, char y) {
return x - y;
}
String:如果其中一个是另外一个起始开始的字串,返回长度之差;否则返回第一个不相等的unicode码之差
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
java.util.Date:根据日期的长整型比较
public int compareTo(Date anotherDate) {
long thisTime = getMillisOf(this);
long anotherTime = getMillisOf(anotherDate);
return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
}
eg:数组排序(使用泛型方法)
public class Utils {
public static <T extends Comparable<T>> void sort(T[] arr){
boolean sorted = true;
int len = arr.length;
for(int j=0;j<len-1;j++){
sorted = true;
for(int i=0;i<len-1-j;i++){
if(((Comparable)arr[i]).compareTo(arr[i+1])<0){
T temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
sorted = false;
}
}
if(sorted){
break;
}
}
}
public static void main(String[] args) {
String[] arr1 = {"32","13","28","40"};
Utils.sort(arr1);
System.out.println(Arrays.toString(arr1));
String[] arr2 = {"a","abcd","abc","def"};
Utils.sort(arr2);
System.out.println(Arrays.toString(arr2));
}
}
Treeset与TreeMap
- TreeMap:确保key可以排序或者提供比较器
- 确保key可以排序
- 提供key比较器
- public TreeMap(Comparator <? super K> comparator)
- TreeSet
- 确保元素实体可以排序,不可重复
- 对比:set接口:HashSet元素必须重写hashcode和equal方法
- 去重:比较等于0即重复
- 注意:在添加数据时排序,数据更改不会影响原来的顺序,不要修改数据,否则可能重复
- 排序比较器
- public TreeSet(Comparator<? super E> comparator)
- 确保元素实体可以排序,不可重复
eg:
public class Person {
public final String name;
public final int handsome;
public Person(String name, int handsome) {
this.name = name;
this.handsome = handsome;
}
public String getName() {
return name;
}
public int getHandsome() {
return handsome;
}
@Override
public String toString(){
return "姓名:"+this.name+",帅气指数:"+this.handsome+"\n";
}
}
TreeSet
public class TreeSetDemo {
public static void main(String[] args) {
Person p1 = new Person("you",100);
Person p2 = new Person("AA",200);
Person p3 = new Person("BB",50);
Person p4 = new Person("CC",30);
//依次存放到TreeSet容器中,使用排序的业务类(匿名内部类)
TreeSet<Person> persons = new TreeSet<Person>(
new java.util.Comparator<Person>(){
@Override
public int compare(Person o1,Person o2){
return o1.getHandsome()-o2.getHandsome();
}
}
);
persons.add(p1);
//TreeSet 在添加数据时排序
persons.add(p2);
persons.add(p3);
persons.add(p4);
System.out.println(persons);
}
}
TreeMap
public class TreeMapDemo {
public static void main(String[] args) {
Person p1 = new Person("you",100);
Person p2 = new Person("AA",200);
Person p3 = new Person("BB",50);
Person p4 = new Person("CC",30);
TreeMap<Person,String> map = new TreeMap<Person,String>(
new java.util.Comparator<Person>(){
@Override
public int compare(Person o1,Person o2){
return o1.getHandsome()-o2.getHandsome();
}
}
);
map.put(p1, "abcde");
map.put(p2, "abcde");
map.put(p3, "abcde");
map.put(p4, "abcde");
Set<Person> persons = map.keySet();
System.out.println(persons);
}
}