Set集合(HashSet、LinkedHashSet、TreeSet)

Set集合:

 * 	特点:
 * 	不包含重复元素,由于它不能直接实例化,
 * 一般情况 使用子实现类实例化:	HashSet TreeSet

HashSet集合:

元素唯一的,存储和取出不一致(无序性),特别是它不保证该顺序恒久不变。

	Set<Student> set = new HashSet<Student>()//创建学生对象
		Student s1 = new Student("亚索", 20) ;
		Student s2 = new Student("盲僧", 18) ;
		Student s3 = new Student("盲僧", 18) ;
		Student s4 = new Student("螳螂", 25) ;
		Student s5 = new Student("螳螂", 25) ;
		Student s6 = new Student("ez", 27) ;
		Student s7 = new Student("ez", 27) ;
		
		//给集合中添加
		set.add(s1) ;
		set.add(s2) ;
		set.add(s3) ;
		set.add(s4) ;
		set.add(s5) ;
		set.add(s6) ;
		set.add(s7) ;
		//遍历集合
				for(Student s: set) {
					System.out.println(s.getName()+"---"+s.getAge());
				}
		/*	 HashSet集合:不能保证集合的顺序恒久不变!唯一
		 *输出结果:
		 *  螳螂---25
			盲僧---18
			ez---27
			亚索---20
		 * */

LinkedHashSet

/*
 * LinkedHashSet:底层依赖于哈希表和链接列表实现
 * 	由哈希表保证元素唯一
 *  由链表保证元素有序 
 * 特点:有序性和唯一性
 * */
public class LinkedHashSetDemo {
	
	public static void main(String[] args) {
		//创建一个LinkedHashSet集合对象
		LinkedHashSet<String> set = new LinkedHashSet<String>() ;
		
		//添加字符串元素
		set.add("hello") ;
		set.add("world") ;
		set.add("java") ;
		set.add("java") ;
		set.add("hello") ;
		set.add("javaee") ;
		
		//遍历
		for(String s: set) {
			System.out.println(s);
		}
	}
	/*
		hello
		world
		java
		javaee
	*/

TreeSet

基于TreeMap的实现,底层数据结构是一种红黑树结构,根据使用不同的构造方法,排序不同, 
TreeSet集合两种排序
 * 		自然排序,对于自定义的类实现Comparable接口,重写compareTo(T o)方法,通过无参构造放TreeSet() ;
 * 		比较器排序:是一个有参构造方法		
 * 
 * 使用TreeSet集合存储Student类型(自然排序)
 * 		主要条件:按照姓名的长度从小到大排序
 * 		次要条件:(分析一两个次要条件)
 * 			长度一样,姓名内容不一定一样,
 * 			姓名内容相同,年龄不一定一样
 
 
1、自然排序  Comparable接口 重写compareTo(T o)的返回值默认是0, 
import java.util.TreeSet;
/*
 * 需求:使用TreeSet存储自定义对象Student
 * 为什么出现这个ClassCastException:Student类型不能转换为Comparle接口
 *如果要使用自然排序---->TreeSet(); 必须让当前该集合的类型实现自然排序的接口comparable
 *
 *		主要条件:按照年龄从小到大排序
 *			
 *		自己分析次要条件
 *			年龄如果一样,不一定
 *			姓名的内容比较
 * */
public class TreeSetDemo2 {
	
	public static void main(String[] args) {
		//创建TreeSet集合对象
		//public TreeSet()构造一个新的空 set,该 set 根据其元素的自然顺序进行排序
		TreeSet<Student> ts = new TreeSet<Student>() ;
		
		//创建几个学生对象
		Student s1 = new Student("zhangguorong", 20) ;
		Student s2 = new Student("wanglihong", 20) ;
		Student s3 = new Student("wenzhang", 20) ;
		Student s4 = new Student("zhangguorong", 28) ;
		Student s5 = new Student("gaoyuanyuan", 25) ;
		Student s6 = new Student("zhaoyouting", 29) ;
		Student s7 = new Student("zhaoyouting", 35) ;
		
		//添加到集合中
		// java.lang.ClassCastException: 
		//com.qianfeng.set_04.Student cannot be cast to java.lang.Comparable
		ts.add(s1) ;
		ts.add(s2) ;
		ts.add(s3) ;
		ts.add(s4) ;
		ts.add(s5) ;
		ts.add(s6) ;
		ts.add(s7) ;
		
		//遍历
		for(Student s :ts) {
			System.out.println(s.getName()+"---"+s.getAge());
		}
		/*
		zhaoyouting---35
		zhaoyouting---29
		zhangguorong---28
		gaoyuanyuan---25
		wanglihong---20
		wenzhang---20
		zhangguorong---20
		*/
	}
}

//实现自然排序接口
public class Student implements Comparable<Student> {
	private String name ;
	private int age ;
	
	public Student() {
		super();
	}
	

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}


	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}


	@Override
	public int compareTo(Student s) {//存储s1对象根节点  s2进行比较
//		return 0; //0
		//按照年龄从小到大进行排序
		int num = s.age -this.age ;
		
		//加上次要条件
		//年龄如果一样,不一定
		 //姓名的内容比较
		int num2 = (num==0)?(this.name.compareTo(s.name)) :num ;
		
		return num2 ;
		
	}
	
}
2、 比较器排序
 * 		主要条件:按照姓名的长度从小到大排序
 * */
import java.util.Comparator;
public class TreeSetDemo {
		
	public static void main(String[] args) {
		
		//创建一个TreeSet集合对象,有参构造方式
		TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() ) ; //子实现类对象
		@Override
	public int compare(Student s1, Student s2) {
		//return 0;
		
		//s1----->刚才使用自然排序里面 this 
		//s2----->刚才使用自然排序里面的s
		
		//主要条件:按照姓名的长度从小到大排序
		int num = s1.getName().length()-s2.getName().length() ;
		//次要条件:姓名长度一样,内容不一定一样
		int num2 = (num==0)?(s1.getName().compareTo(s2.getName())): num ;
		//内容一样,不一定年龄一样
		int num3 = (num2==0)?(s1.getAge()-s2.getAge()):num2 ;
		return num3;
		}
	});
		//创建学生对象
		Student s1 = new Student("zhangguorong", 20) ;
		Student s2 = new Student("wanglihong", 20) ;
		Student s3 = new Student("wenzhang", 20) ;
		Student s4 = new Student("zhangguorong", 28) ;
		Student s5 = new Student("gaoyuanyuan", 25) ;
		Student s6 = new Student("zhaoyouting", 29) ;
		Student s7 = new Student("zhaoyouting", 35) ;
		Student s8 = new Student("liushishi", 34) ;
		Student s9 = new Student("wuqilong", 43) ;
		Student s10 = new Student("wenzhang", 27) ;
		
		//添加集合中
		ts.add(s1) ;
		ts.add(s2) ;
		ts.add(s3) ;
		ts.add(s4) ;
		ts.add(s5) ;
		ts.add(s6) ;
		ts.add(s7) ;
		ts.add(s8) ;
		ts.add(s9) ;
		ts.add(s10) ;
		
		//遍历
		for(Student s:ts) {
			System.out.println(s.getName()+"---"+s.getAge());
		}	
	}
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值