Comparable(自然排序): java.lang包下的一个接口,只有一个方法compareTo
String,Integer等都实现该接口所以使用Collections.sort()可以进行自然排序,某个对象想进行排序的可以实现该接口:
public class MyComparable implements Comparable<MyComparable> {
private int count;
public MyComparable(int count) {
this.count = count;
}
public MyComparable() {
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
@Override
public int compareTo(MyComparable o) {
return o.getCount() - this.getCount();
}
根据count的进行排序,代码是降序排列,升序可调换对象位置实现:
List<MyComparable> comparables = new ArrayList<>();
MyComparable comparable = new MyComparable(1);
MyComparable comparable2 = new MyComparable(2);
MyComparable comparable3 = new MyComparable(3);
MyComparable comparable4 = new MyComparable(4);
MyComparable comparable5 = new MyComparable(5);
comparables.add(comparable);
comparables.add(comparable4);
comparables.add(comparable3);
comparables.add(comparable2);
comparables.add(comparable5);
Collections.sort(comparables);
System.out.println("Collections sort ========================================");
for (MyComparable myComparable : comparables) {
System.out.println(myComparable.getCount());
}
使用Comparable如果想改变排序规则,需要修改实体类,不够灵活!对于这点我们可以使用Comparator这个工具类来代替
Comparator(定制化排序) java.util包中的接口 顾名思义它是一个工具可以看做是第三方 使用的是一种策略模式,可以不用需改被排序类的结构实现定制化排序
public class MyComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
public static void main(String[] args) {
String str1 = "a";
String str2 = "b";
MyComparator comparator = new MyComparator();
TreeMap<String, String> treeMap = new TreeMap(comparator);
treeMap.put(str2, str2);
treeMap.put(str1, str1);
for (Map.Entry<String, String> entry : treeMap.entrySet()) {
System.out.println(entry.getKey() + "\t" + entry.getValue());
}
}
总结
Java排序有两种:
- Comparable(自然排序)需要在实体类实现
- Comparator(定制化排序)无需修改实体类,直接调用(一般使用匿名类)示例:
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return 0;
}
};