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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值