`
Luob.
  • 浏览: 1589955 次
  • 来自: 上海
社区版块
存档分类
最新评论

java之15天 TreeSet集合 (一)

    博客分类:
  • Java
阅读更多
HashSet 和 TreeSet

TreeSet的第一种排序 元素自身拥有比较功能 哈哈
/**
 * Set 无序的,不可以重复元素
 *  |--HashSet: 底层数据结构是哈希表, 线程不同步
 *    		hashSet是如何保证元素唯一性呢?
 *           是通过元素的两个方法, hashCode 和  equals 来完成的 
 *           如果元素的hashCode值相同,才会判断equals 是否为true
 *           如果元素的hashCode值不同,不会调用 equals.
 *           
 *           注意: 对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法.
 *             
 *  |--TreeSet: 可以对Set集合中的元素进行排序
 *  			底层数据结构式是二叉树
 *  			保证元素唯一性的依据
 *              compareTo 方法 return 0  TreeSet 中就只会有一个 元素
 *              
 *              TreeSet排序的第一种方式,让元素自身具备比较性,
 *              元素需要实现Comparable接口,覆盖compareTo 方法
 *              这种方式 也成为元素的自然顺序,或者叫默认顺序.
 *              
 *              TreeSet的第二种排序方式.
 *              当元素自身不具备比较性时,或者具备的比较性不是所需要的 .
 *              这是就需要让集合自身具备比较性.
 *              在集合初始化时,就有了比较方式.
 *              
 *              
 *  需求:
 *  往TreeSet集合中存储自定义对象学生
 *  想按照学生的年龄进行排序.
 *  
 *  记住:排序时,当主要条件相同时,一定要判断一下次要条件.
 *     
 */

public class TreeSetDemo {
	public static void main(String[] args) {
		method_1();
		System.out.println("=======================");
		method_2();
	}

	//保存自定义对象
	public static void method_2(){
		TreeSet ts=new TreeSet();
		ts.add(new Student("lisi01",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi01",19));
		ts.add(new Student("lisi01",40));
		ts.add(new Student("lisi007",30));
		ts.add(new Student("lisi09",36));
		ts.add(new Student("lisi01",29));
		ts.add(new Student("lisi01",90));
		
		Iterator it=ts.iterator();
		while(it.hasNext()){
			Student stu=(Student)it.next();
			System.out.println(stu.getName()+"...."+stu.getAge());
		}
		
	}
	
	//保存普通对象
	public static void method_1(){
		TreeSet ts= new TreeSet();
		ts.add("cba");
		ts.add("abcd");
		ts.add("aaa");
		ts.add("bca");
		
		Iterator it =ts.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
}
//使用TreeSet来保存自定义对象

class Student implements Comparable{
	private String name;
	private int age;
	Student(String name,int age){
		this.name=name;
		this.age=age;
	}
	
	public String getName(){
		return name;
	}
	
	public int getAge(){
		return age;
	}

	@Override
	public int compareTo(Object obj) {
		// TODO Auto-generated method stub
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student stu=(Student)obj;
		if(this.age>stu.age)
			return 1;
		else if(this.age==stu.age){
	    	//return 0;
	    	//如果年龄相同的时候  就需要按照姓名排序
	    	return this.name.compareTo(stu.name);
		}
		return -1;
	}
}


TreeSet 的第二种比较方式(当元素自身不具备比较方法的时候)
/**
 *  TreeSet的第二种排序方式.
 *  
 *  当元素自身不具备比较性时,或者具备的比较性不是所需要的 .
 *  这是就需要让集合自身具备比较性.
 *  在集合初始化时,就有了比较方式.
 *   步骤
 *   1.定义比较器 (定义一个类,实现Comparator,覆盖compare方法.)
 *   2.传递给 TreeSet比较器
 *   
 *   注意:
 *     当两种排序都存在时候,以比较器为主.
 *   
 *  
 *  需求变了:
 *  要改成  name排序   这样我们为了 不需改 Student 的原比较方法  我们定义一个比较器 采用 name进行比较
 */
public class TreeSetDemo1 {

	public static void main(String[] args) {
		//之前才使用 age比较
		method_1();
		//需求变了 要改成  name排序   这样我们为了 不需改 Student 的原比较方法  我们定义一个比较器 采用 name进行比较
		System.out.println("==========================");
		//改成使用 name比较
		method_2();
		
	}
	public static void method_2(){
		//这样就可以 实现 name比较了哦
		TreeSet ts=new TreeSet(new StudentComparator());
		ts.add(new Student("lisi01",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi01",19));
		
		
		Iterator it=ts.iterator();
		while(it.hasNext()){
			Student stu=(Student)it.next();
			System.out.println(stu.getName()+"...."+stu.getAge());
		}
	}
	public static void method_1(){
		TreeSet ts=new TreeSet();
		ts.add(new Student("lisi01",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi01",19));
		
		Iterator it=ts.iterator();
		while(it.hasNext()){
			Student stu=(Student)it.next();
			System.out.println(stu.getName()+"...."+stu.getAge());
		}
	}

}

class Student implements Comparable{
	private String name;
	private int age;
	
	Student(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
	
	@Override
	public int compareTo(Object obj) {
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student stu=(Student)obj;
		return new Integer(this.age).compareTo(new Integer(stu.getAge()));
	}
	
}

class StudentComparator implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		Student t1=(Student)o1;
		Student t2=(Student)o2;
		int num=t1.getName().compareTo(t2.getName());
		if(num==0)
			return new Integer(t1.getAge()).compareTo(new Integer(t2.getAge()));
		return num;
	}
	
}



TreeSet练习
/**
 * 练习 :按照字符串的长度排序
 * 字符串本身具备比较性,但是他的比较方式不是所需要的.
 * 
 * 这时就只能使用比较器.
 * 注意 : 主要和次要条件的比较 
 */

public class TreeSetTest {

	public static void main(String[] args) {
		TreeSet ts=new TreeSet(new StrLenComparator());
		ts.add("abcde");
		ts.add("cc");
		ts.add("bad");  //长度都相同 内容不同
		ts.add("gdg");  //长度都相同 内容不同
		ts.add("hahaha");
		
		Iterator it=ts.iterator();
		
		while(it.hasNext())
			System.out.println(it.next());
		
	}

}

class StrLenComparator implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		String s1=(String)o1;
		String s2=(String)o2;
		
		/*
		if(s1.length()>s2.length())
			return 1;
		if(s1.length()==s2.length())
			return 0;
		return -1;
		*/
		int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
		
		//主要条件判断完了 判断次要条件  
		if(num==0)
			return s1.compareTo(s2);
		
		return num;
	}
	
}

0
4
分享到:
评论
3 楼 肖泽文 2013-05-30  
Luob. 写道
如果重写 Student 的 hashcode 方法 返回一个固定的值,这样 hashcode就不能判断两个对象是否是同个对象了.
@Override
public int hashCode() {
// TODO Auto-generated method stub
return 17;
}


谢谢,我懂了!
2 楼 Luob. 2013-05-30  
如果重写 Student 的 hashcode 方法 返回一个固定的值,这样 hashcode就不能判断两个对象是否是同个对象了.
@Override
public int hashCode() {
// TODO Auto-generated method stub
return 17;
}
1 楼 肖泽文 2013-05-30  
hashSet是如何保证元素唯一性呢?
*           是通过元素的两个方法, hashCode 和  equals 来完成的 
*           如果元素的hashCode值相同,才会判断equals 是否为true
*           如果元素的hashCode值不同,不会调用 equals.

楼主你是不是写错了,如果不是求解释!

hashcode决定的是两者是不是同一个对象,值可以简单理解为对象的值;如果hashcode算法完善无缺,那么它相同则值就一定相同,因为两者就是同一个对象,值能不相同么? hashcode不同,则说明两者不是同一对象,而不同对象也有可能值相等,这就无法确定了。

相关推荐

    跟我学java26日通 第15天 Java类集框架

    Java类集框架是Java编程语言中的核心组成部分,它为开发者提供了高效、灵活的数据存储和...通过"跟我学java26日通 第15天 Java类集框架"的教程,你可以逐步掌握这些关键技能,为成为一名熟练的Java开发者打下坚实基础。

    java基础18天Typora笔记

    这是一份专为Java初学者准备的学习资源,由魔乐科技提供,旨在帮助用户在18天内建立起坚实的Java编程基础。Typora是一款简洁而高效的Markdown编辑器,使得笔记整理和阅读更加便捷。通过这份笔记,学习者将逐步了解并...

    21天学java培训笔记和代码

    9. **集合框架**:Java集合框架是处理对象数组的强大工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)等接口及其实现类。 10. **IO流**:Java的IO流系统支持对...

    java速成100天

    同时,学习集合框架,如List(ArrayList、LinkedList)、Set(HashSet、TreeSet)和Map(HashMap、TreeMap)等,以及它们之间的区别和应用场景。 4. **异常处理**:理解如何使用try-catch-finally语句块来捕获和...

    18天java学习之经典笔记

    "18天Java学习之经典笔记"是一份专为快速掌握Java基础知识而设计的学习资料,适用于那些希望在短时间内复习、备考或者准备面试的人员。这份笔记涵盖了Java的核心概念,通过18天的学习计划,帮助读者逐步理解并熟练...

    毕向东_Java 25天基础源代码

    《毕向东_Java 25天基础源代码》是一份专为初学者设计的Java编程学习资源,由知名IT教育专家毕向东精心编撰。这个资料包包含了25天的学习计划,每天的学习内容都对应一个具体的Java编程概念或技术,通过源代码的形式...

    java 2 编程21天自学通

    Java 2 编程21天自学通是一本旨在帮助初学者在短时间内掌握Java编程语言的教程。在21天的学习计划中,你将逐步深入理解Java的核心概念和技术,建立起坚实的编程基础。以下是对Java 2(即Java SE 2)编程的一些关键...

    21天学通java pdf版

    《21天学通Java》是一本非常受欢迎的Java初学者教程,旨在帮助读者在短短21天内掌握Java编程的基础知识。这本书以其系统性、易懂性和实践性深受广大编程爱好者喜爱。以下是对该书内容的一些核心知识点的详细解释: ...

    黑马20天学java视频看完后整理的思维导图

    "黑马20天学java视频"可能是一个针对初学者的快速学习课程,旨在帮助学员在短时间内掌握Java的基础知识和核心概念。通过观看这个系列的视频,学习者可以深入理解Java编程的各个方面,并通过整理的思维导图进行巩固。...

    十五天的时间进行JAVA学习的入门

    以下是一些关于Java学习的关键知识点,这些知识点将在你的十五天学习之旅中扮演重要角色。 1. **Java基础知识**:首先,你需要理解Java的基础语法,包括数据类型(如整型、浮点型、字符型和布尔型)、变量、常量...

    java_21Days(下)

    《Java 21 Days(下)》是一本专为初学者设计的Java编程入门书籍,旨在帮助读者在21天内逐步掌握Java编程基础。在接下来的内容中,我们将深入探讨这个压缩包文件“java_21Days_master(下)”可能包含的丰富知识点。 1....

    Java面试宝典-经典

    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...

    java编程语言的源码,可供应用学习

    5. **集合框架**:Java集合框架包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap),它们提供了存储和操作对象的高效方法。 6. **I/O流**:Java的I/O流用于读写文件、...

    java面试题大全(2012版)

    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...

    21天学通Java-由浅入深

    第一篇 基础篇 第1章 Java简介(精彩视频:33分钟) 21 1.1 Java的平台简介 21 1.2 安装工具包 22 1.2.1 下载JDK 22 1.2.2 安装JDK 24 1.2.3 查看与设置环境变量 25 1.2.4 JDK常用命令 27 1.2.5 Java各个目录含义 28...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    java学习路线

    8. **集合框架**:Java集合框架是处理对象集合的工具,包括List(ArrayList、LinkedList)、Set(HashSet、TreeSet)和Map(HashMap、TreeMap)。学习它们的基本操作和使用场景。 9. **IO流**:掌握输入/输出流的...

    最新Java面试宝典pdf版

    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...

Global site tag (gtag.js) - Google Analytics