Java 学习 day19: set,比较器,范型

本文介绍了TreeSet的基本概念,包括无序、不可重复的特点以及数字、字符串和日期的排序规则。重点讲解了使用Comparable接口进行自动排序和Comparator手动排序的方法,以及如何通过范型实现类型安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值