Java学习第十六天--set

特点:

无序,不可复制,没有下标

HashSet的剔重原理

原理:
        1,给HashSet中存储对象时,会默认调用对象的hashcode方法,获取其值,如果该值与集合中其他对象的值相同,那么就认为重复,不相同认为不重复
        2,不重复直接存储,如果存储的对象的hashcode值与已经在集合中的对象hashcode值重复,调用对象的equals方法与重复的对象进行比较
        3,如果equals也相同,认为重复,此时不在给集合中存储.如果不相同,那么存储到集合中
使用场景:

如:图书管理系统录入图书信息
        将书籍信息存入到集合中,如果属性值都相同认为重复,不在存储
        如果相同提示已经录入
        书籍信息:
                书名
                作者
                出版社
                价格
                编号
                出版时间

/*
 * 1,如:图书管理系统录入图书信息
将书籍信息存入到集合中,如果属性值都相同认为重复,不在存储
如果相同提示已经录入
书籍信息:
书名
作者
出版社
价格
编号
出版时间
 */
public class Book {
	private String bookName;
	private String writerName;
	private double money;
	public Book() {
		super();
	}
	public Book(String bookName, String writerName, double money) {
		super();
		this.bookName = bookName;
		this.writerName = writerName;
		this.money = money;
	}
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public String getWriterName() {
		return writerName;
	}
	public void setWriterName(String writerName) {
		this.writerName = writerName;
	}
	public double getMoney() {
		return money;
	}
	public void setMoney(double money) {
		this.money = money;
	}
	@Override
	public String toString() {
		return "Student [bookName=" + bookName + ", writerName=" + writerName + ", money=" + money + "]";
	}
	
	@Override
		public int hashCode() {  //需要重写hashCode方法
			int num01 = bookName.hashCode();
			int num02 = writerName.hashCode();
			//return num01+num02+(int)money;
			return (int)money;
		}
	@Override
		public boolean equals(Object obj) {  //需要重写equals方法
			if (this == obj) {
				return true;
			}
			if (obj instanceof Book) {
				Book student = (Book) obj;
				if (this.bookName.equals(student.bookName) && 
						this.writerName.equals(student.writerName) &&
						this.money == student.money) {
					return true;
				}
			}
			return false;
		}
}
import java.util.HashSet;
import java.util.LinkedHashSet;

/*
 * 1,如:图书管理系统录入图书信息
将书籍信息存入到集合中,如果属性值都相同认为重复,不在存储
如果相同提示已经录入
书籍信息:
书名
作者
出版社
价格
编号
出版时间
 */
public class Demo01 {
	public static void main(String[] args) {
		LinkedHashSet<Book> list = new LinkedHashSet<Book>();
		Book student01 = new Book("Java基础", "张三", 1000);
		Book student02 = new Book("Java初级", "李四", 10000);
		Book student03 = new Book("Java中级", "王五", 100000);
		Book student04 = new Book("Java高级", "小明", 1000000);
		Book student05 = new Book("Java初级", "李四", 10000);
		
		if (!list.add(student01)) {
			System.out.println("输入书籍重复");
		}
		if (!list.add(student02)) {
			System.out.println("输入书籍重复");
		}
		if (!list.add(student03)) {
			System.out.println("输入书籍重复");
		}
		if (!list.add(student04)) {
			System.out.println("输入书籍重复");
		}
		if (!list.add(student05)) {
			System.out.println("输入书籍重复");
		}
		for (Book s : list) {
			System.out.println(s);
		}
	}
}

LinkedHashSet

LinkedHashSet是HashSet的子类,所在存储原理一致
注意:LinkedHashSet的数据结构比HashSet多了一个链表,该连接是用于记录存储数据的顺序,所以LinkedHashSet是有序的

TreeSet

数据结构:红黑树+自定义
存储的要求:
        方案1,指定比较器
        方案2,存储的数据拥有比较性
                如果以上两个方案都没有使用,那么给TreeSet中存值会报错
方案1:
        创建TreeSet对象时,指定比较器
        重写compare方法
原理:
        每次存入对象时,使用对于集合中原有的对象进行比较(使用的是compare方法)
        如果集合中没有值,那么自己与自己比,比完后存入
        如果集合中已经存在数据,那么使用本次存入的数据与集合中已有的数据一一比较
        如果有相同就证明重复,剔重,并结束比较
        如果没有相同的数据,那么将本次存入的数据存储到集合中

/*
 * 使用TreeSet存入以下信息
张三 男 18 220901
李四 女 21 220905
王五 男 28 220903
小花 女 19 220902
老王 男 25 220908
要求:使用比较器与比较性两种方式
 */
public class Person implements Comparable<Person>{//实现Comparable接口
	private String name;
	private String sex;
	private int age;
	private int birthday;
	public Person() {
		super();
	}
	public Person(String name, String sex, int age, int birthday) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.birthday = birthday;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getBirthday() {
		return birthday;
	}
	public void setBirthday(int birthday) {
		this.birthday = birthday;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", sex=" + sex + ", age=" + age + ", birthday=" + birthday + "]";
	}
	@Override
	public int compareTo(Person o) {//重写compareTo方法
		if (this.name == null || this.sex == null ) {
			return 0;
		}
		int nameNum = this.getName().compareTo(o.getName());
		int sexNum = this.getSex().compareTo(o.getSex());
		int ageNum = this.getAge() - o.getAge();
		int birthdayNum = this.getBirthday() - o.getBirthday();
		//return nameNum+sexNum+ageNum+birthdayNum;
		return ageNum;
	}
	
}
import java.util.TreeSet;

/*
 * 使用TreeSet存入以下信息
张三 男 18 220901
李四 女 21 220905
王五 男 28 220903
小花 女 19 220902
老王 男 25 220908
要求:使用比较器与比较性两种方式
 */
public class Demo05 {
	public static void main(String[] args) {
		TreeSet<Person> list = new TreeSet<Person>();
		Person person01 = new Person("张三", "男", 18, 220901);
		Person person02 = new Person("李四", "女", 21, 220905);
		Person person03 = new Person("王五", "男", 28, 220903);
		Person person04 = new Person("小花", "女", 19, 220902);
		Person person05 = new Person("老王", "男", 25, 220908);
		
		list.add(person01);
		list.add(person02);
		list.add(person03);
		list.add(person04);
		list.add(person05);
		
		for (Person person : list) {
			System.out.println(person);
		}
	}
}


方案2:
        创建TreeSet存储的对象所属的类要拥有比较性
        让存储的对象所属的类实现实现Comparable接口

/*
 * 使用TreeSet存入以下信息
张三 男 18 220901
李四 女 21 220905
王五 男 28 220903
小花 女 19 220902
老王 男 25 220908
要求:使用比较器与比较性两种方式
 */
public class Person02 {
	private String name;
	private String sex;
	private int age;
	private int birthday;
	public Person02() {
		super();
	}
	public Person02(String name, String sex, int age, int birthday) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.birthday = birthday;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getBirthday() {
		return birthday;
	}
	public void setBirthday(int birthday) {
		this.birthday = birthday;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", sex=" + sex + ", age=" + age + ", birthday=" + birthday + "]";
	}
	
}
import java.util.Comparator;
import java.util.TreeSet;

import com.qf.demo05.Person;

public class Demo06 {
	public static <T> void main(String[] args) {
		TreeSet<Person02> list = new TreeSet<Person02>(new Comparator<Person02>() {

			@Override
			public int compare(Person02 o1, Person02 o2) {
				int nameNum = o1.getName().compareTo(o2.getName());
				int sexNum = o1.getSex().compareTo(o2.getSex());
				int ageNum = o1.getAge() - o2.getAge();
				int birthdayNum = o1.getBirthday() - o2.getBirthday();
				return nameNum + sexNum + ageNum + birthdayNum;
			}
			
		});
		
		Person02 person01 = new Person02("张三", "男", 18, 220901);
		Person02 person02 = new Person02("李四", "女", 21, 220905);
		Person02 person03 = new Person02("王五", "男", 28, 220903);
		Person02 person04 = new Person02("小花", "女", 19, 220902);
		Person02 person05 = new Person02("老王", "男", 25, 220908);
		
		list.add(person01);
		list.add(person02);
		list.add(person03);
		list.add(person04);
		list.add(person05);
		
		for (Person02 person022 : list) {
			System.out.println(person022);
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值