黑马程序员_Collection集合之Set

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流------


1.set集合的概述
Set集合: 元素唯一,并且无序
 	在添加元素的时候,集合有对元素处理的自己的顺序,而如果我们添加的时候刚好和这个顺序相同,不能说明其是有序的.
 创建对象格式为:
 	Set set = new HashSet() ;
 而哈希表保证元素的唯一性是依赖于两个方法一个hashCode方法一个equals方法
 并且先判断的是hashCode方法,然后调用equals方法,如果两个都是true.则认为是同一个元素,所以没有添加.
  
  字符串重写hashCode方法和eqauls方法
  如果是自定义变量则其中要重写hashCode跟equals方法,可以使用快捷键生成
  
LinkedHashSet的数据结构是:  链表和哈希表 , 有序
  	有序性: 是靠链表保证
  	唯一性: 是靠哈希表保证
public class LinkedHashSetTest {
	
	public static void main(String[] args) {
		
		// 创建对象
		LinkedHashSet hs = new LinkedHashSet() ;
		
		// 添加元素
		hs.add("hello") ;
		hs.add("world") ;
		hs.add("java") ;
		hs.add("world") ;
		
		// 遍历
		for(String s : hs){
			System.out.println(s);
		}
	}
}

2. 使用TreeSet对元素进行排序:
TreeSet可以对元素进行排序
  	排序分为两种方式:	
  		自然排序
  		比较器排序
 	到底使用的是哪一个中排序规则,是根据构造方法来区分的.
 	构造方法:
  			public TreeSet():		按照自然排序
  			public TreeSet(Comparator comparator):	按照比较器进行排序
 
 使用TreeSet集合存储自定义对象. 排序
  	按照自定义对象的年龄进行排序
  	TreeSet集合在存储元素的时候,要求元素必须实现Comparable接口
  	
使用TreeSet进行存储对象,使用比较器排序
  构造方法:
  	public TreeSet(Comparator comparator):采用匿名内部类的格式
 
  区分这两种排序方式,主要依赖于构造方法.
	如果说构造方法是空参,那么使用的就是自然排序
	要求元素必须实现Comparable接口,复写compareTo方法
	
	如果使用的是有参的构造方法: public TreeSet(Comparator comparator)
	使用的是比较器在进行比较.
	两种方式:
		第一种编写一个类,然后让这个类实现Comparator接口, 复写compare方法
		第二种使用匿名内部类的方式.
 

(1)自然排序法
//实现comparable的学生类 ,注意泛型,其中复写compareTo方法
 public class Student implements Comparable {
	
	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 int compareTo(Student o) {
		
		// 按照姓名的长度进行排序
		int num = this.name.length() - o.name.length() ;
		
		// 姓名
		int num2 = (num == 0) ? this.name.compareTo(o.name) : num ;
		
		// 比较年龄
		int num3 = (num2 == 0 ) ? this.age - o.age : num2 ;
		
		return num3;
	}

}

//测试类

import java.util.TreeSet;

public class HashSetTest01 {
	
	public static void main(String[] args) {
		
		//创建TreeSet对象使用自然排序
		TreeSet ts = new TreeSet();
		
		//创建Student对象:来个四大美女吧!
		Student s1 = new Student("diaochan" , 16);
		Student s2 = new Student("xishi" , 14);
		Student s3 = new Student("yangyuhuan" , 18);
		Student s4 = new Student("wangzhaojun" , 19);
		Student s5 = new Student("diaochan" , 16);
		Student s6 = new Student("wangzhaojun" , 19);
		Student s7 = new Student("diaochan" , 18);
		Student s8 = new Student("貂蝉" , 16);
		
		//添加到集合中
		ts.add(s1);
		ts.add(s2);
		ts.add(s3);
		ts.add(s4);
		ts.add(s5);
		ts.add(s6);
		ts.add(s7);
		ts.add(s8);
		
		//遍历
		for (Student s : ts) {
			
			//输出元素
			System.out.println(s.getName() + "----" + s.getAge());
		}
	}
}

(2)使用匿名内部类实现上述要求
//普通的学生类对象
public class 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;
	}
	
}

//匿名内部类实现的TreeSet集合

public class TreeSetTest02 {
	
	public static void main(String[] args) {
		
		//创建对象
		TreeSet ts = new TreeSet(new Comparator() {

			@Override
			public int compare(Student s1, Student s2) {
				// TODO Auto-generated method stub
				// 按照姓名的长度进行排序
				//按照年龄的大小
				int num = s1.getAge() - s2.getAge() ;
				
				//按照姓名长度
				int num2 = (num == 0) ? s1.getName().length() - s2.getName().length() : num ;
				
				//按照姓名
				int num3 = (num2 == 0) ? s1.getName().compareTo(s2.getName()) : num2 ;
				
				return num3 ;
			}
		});

		//创建Student对象:来个四大美女吧!
		Student s1 = new Student("diaochan" , 16);
		Student s2 = new Student("xishi" , 14);
		Student s3 = new Student("yangyuhuan" , 18);
		Student s4 = new Student("wangzhaojun" , 19);
		Student s5 = new Student("diaochan" , 16);
		Student s6 = new Student("wangzhaojun" , 19);
		Student s7 = new Student("diaochan" , 18);
		Student s8 = new Student("貂蝉" , 16);
		
		//添加到集合中
		ts.add(s1);
		ts.add(s2);
		ts.add(s3);
		ts.add(s4);
		ts.add(s5);
		ts.add(s6);
		ts.add(s7);
		ts.add(s8);
		
		//遍历
		for (Student s : ts) {
			
			//输出元素
			System.out.println(s.getName() + "----" + s.getAge());
		}	
	}
}

你可能感兴趣的:(黑马程序员_Collection集合之Set)