1.TreeSet
1.1 什么是set
set特点: 无序,不可重复,添加顺序和取出顺序不一定一致
TreeSet: 存进去的元素,会按照某个规则进行排序
数字:从小到大
字符串:每一位ASCII
日期:自然日期
1.2 使用方式
public static void main(String[] args) {
//数字 升序排序
Set set = new TreeSet() ;
set.add(10) ;
set.add(1);
set.add(2) ;
//重复的添加不进去
set.add(2) ;
//报错,因为不是相同类型没有可比性
//set.add("111");
System.out.println(set) ;
for(Object object:set){
System.out.println(object) ;
}
//字符串,比较ASC||码
Set strs = new TreeSet() ;
strs.add("123") ;
strs.add("12") ;
strs.add("1") ;
strs.add("2") ;
strs.add("21") ;
strs.add("3") ;
System.out.println(strs);
}
2.比较器
2.1 Comparable
TreeSet为什么可以排序
因为添加的元素都实现了Comparable接口
在向TreeSet中添加数据的时候,会自动调用该对象的CompareTo()方法
所以 用TreeSet存储我们自己定义的类型时,一定要实现Comparable接口
public static void main(String[] args) {
User u1 = new User(18);
User u2 = new User(19);
User u3 = new User(13);
User u4 = new User(15);
TreeSet set = new TreeSet();
set.add(u1);
set.add(u2);
set.add(u3);
set.add(u4);
System.out.println(set);
ArrayList users = new ArrayList();
users.add(u1);
users.add(u2);
users.add(u3);
users.add(u4);
// 也会自动调用comparable中的comparTo方法
Collections.sort(users);
System.out.println(users);
}
}
class User implements Comparable{
private int age ;
@Override
public int compareTo(Object o) {
//this是指要添加的元素,因为是该元素调用的比较器
//o是指现在这个集合里面的一个元素
if(o instanceof User){
//如果o的类型是User类型实例化而来的,那么就将它向下转型,从Object转为User
User u = (User) o ;
//返回值等于0不添加
//返回值大于零说明this的值大于集合中的值,this往后面放
//返回值小于零说明this的值小于集合中的值,this往前面放
return this.age-u.age ;
}else{
return 0;
}
2.2 Comparator
比较器的两种方式:
1.要添加的元素实现Comparable接口并且覆写compareTo方法
2.集合比较器:Comparator比较器,元素自身不需要实现该接口
如果添加的元素不是我们自定义的类
1.假如该类有排序,但是不是我们想要的排序结果,那么我们就可以使用Comparator
2.假如该类没有排序,没有实现Comparable,呢么我们排序还是要使用Comparator
因为类不是我们写的,我们不能修改人家的代码,所以无法实现Comparable接口,只能使用Comparator
如果添加的元素是我们写的,那么想要排序,优先使用Comparable,这样如果不能满足其他用户的排序规则,别人也可以使用Comparator进行更改
当两个比较器同时存在,那么comparator的优先级大
TreeSet set = new TreeSet(new Comparator(){
@Override
public int compare(Object o1, Object o2) {
Integer i1 = (Integer) o1 ;
Integer i2 = (Integer) o2 ;
//0说明重复,不放元素
//大于0往后面放
//小于0王前面放
return i2-i1;
}
}) ;
set.add(1) ;
set.add(3) ;
set.add(6) ;
set.add(2) ;
System.out.println(set) ;
}
List list = new ArrayList() ;
list.add(1) ;
list.add(11) ;
list.add(2) ;
list.add(3) ;
list.add(14) ;
//因为Integer实现了Comparable接口,所以可以进行排序,默认升序
Collections.sort(list);
System.out.println(list) ;
//假如Integer没有实现Comparable接口或者我们需要降序排序,那么Interger就无法满足我们
的需求
//需要使用Comparator来解决
Collections.sort(list,new Comparator(){
@Override
public int compare(Object o1, Object o2) {
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
//降序
return i2 - i1;
}
});
System.out.println(list);
2.3 Collections
List list = new ArrayList() ;
list.add(1) ;
list.add(11) ;
list.add(2) ;
list.add(3) ;
list.add(14) ;
//因为Integer实现了Comparable接口,所以可以进行排序,默认升序
Collections.sort(list);
System.out.println(list) ;
2.4 练习题
public static void main(String[] args) {
//字符串 比较ASCII
Set strs = new TreeSet(new Comparator(){
@Override
public int compare(Object o1, Object o2) {
String s1 =(String) o1 ;
String s2 =(String) o2 ;
Integer i1 = Integer.parseInt(s1) ;
Integer i2 = Integer.parseInt(s2) ;
return i1 - i2;
}
});
strs.add("123") ;
strs.add("13") ;
strs.add("12") ;
strs.add("23") ;
System.out.println(strs);
3.范型
3.1 什么是范型
3.2 如何使用
List<Integer>list1 = new ArrayList<Integer>();
list1.add(123) ;
//这时候不能保存字符串
//list1.add("123") ;
for(Integer i:list1){
System.out.print(i);
}
3.3 自定义范型
public static void main(String[] args) { Test1 t = new Test1(); t.m1(1); t.m1("xxx"); t.m1("xxx"); t.m1("xxx"); t.m1("xxx"); t.m1("xxx"); Test1<String> t1 = new Test1<String>(); Test1<Integer> t2 = new Test1<Integer>(); // t1.m1(1); t1.m1("xxx"); t2.m1(1); // t2.m1("xx"); } } class Test1<T> { public void m1(T e) { String s = (String) e; } }