比较器
针对于自定义类型 希望根据属性值来排序 则需要先设定这个自定义类型的比较器
让自定义类型去实现比较器接口 编写比较规则
方案一:
实现Comparable接口 实现compareTo(单参)方法
public class Students implements Comparable<Students>{
@Override
public int compareTo(Students o) {
// TODO Auto-generated method stub
//编写比较规则 this o
//<0 =0 >0
//先根据姓名先后升序排 姓名相同 再根据年龄升序排
if(this.name.compareTo(o.name)!=0) {
return this.name.compareTo(o.name);
}else {
//姓名相同 再根据年龄排
return this.age-o.age;
}
//return 0;
}
}
使用:
Arrays.sort(数组名); 默认调用比较规则
方案二:
单独创建一个类作为实体类的比较器
这个类需要实现Comparator 实现compare(双参)方法
public class StuCom implements Comparator<Students> {
@Override
public int compare(Students o1, Students o2) {
// TODO Auto-generated method stub
if(o1.name.compareTo(o2.name)!=0) {
return o1.name.compareTo(o2.name);
}else {
return o1.age-o2.age;
}
}
}
使用:
Arrays.sort(数组名,比较器类对象);
Arrays.sort(stu,new StuCom());//默认调用元素的比较规则 内部实现冒泡排序
练习:
Shop类 shopName 商店名 since 起始年份 Goods属性
Goods类 goodsName 商品名 num 数量 price 单价
按照 年份升序 商店名升序 price降序排列输出 num降序 商品名升序
Wahaha 1995
sn 55 127.5
sn 34 227
ab 55 227
Wahaha 1995
sna 55 127.5
sn 36 227
ab 55 227.5
woniu 2000
sn 45 35.5
ab 55 35.5
beida 2000
sn 45 35.5
ab 55 35.5
集合中使用比较器
1.两种比较器方案同上
2.使用Collections.sort(List<>) Collections.sort(List<>,Comparator)
3.只能对List接口下的集合实现类使用排序
Set接口下的集合只能转为List接口下集合才能使用
总结:
展示顺序:
List接口:
默认情况下 输出顺序和录入顺序一致
可以通过添加比较器 再通过Collections的sort方法去改变输出顺序
Set接口:
默认情况下 输出顺序与录入顺序无关
HashSet/LinkedHashSet
不可以通过比较器固定输出顺序
Collections不存在带Set接口对象作为参数的sort()
TreeSet
基本数据类型和String类型:
默认调用其比较器 升序输出 默认升序输出
引用数据类型:
因为输出时会默认调用元素的比较器 所以集合中的元素类型必须要添加比较器否则报错 ClassCastException
去除重复:
List接口:
本身有下标 可以保存重复值
Set接口;
基本数据类型+String类型都是默认去重
HashSet/LinkedHashSet引用数据类型需要添加hashCode()和equals()去除重复
TreeSet 默认去重 不需要添加hashCode()和equals() 但是引用数据类型不要忘记写比较器
HashSet/LinkedHashSet:去重需要添加hashCode()和equals() 排序则转化为List接口集合
TreeSet:默认去重 但是需要添加比较器
练习:
分别使用HashSet/LinkedHashSet/TreeSet 保存基本数据类型 查看效果
User类型 String name int age
分别使用HashSet/LinkedHashSet/TreeSet 查看效果