JAVA学习第17天

Set

特点:无序,无下标,不可重复

没有提供特有方法

HashSet剃重原理

原理:

        1,给 HashSet 中存储对象时 , 会默认调用对象的 hashcode 方法 , 获取其值 , 如果该值与集合中其他
对象的值相同,那么就认为重复,不相同认为不重复
        2,不重复直接存储 , 如果存储的对象的 hashcode 值与已经在集合中的对象 hashcode 值重复 ,
用对象的 equals方法与重复的对象进行比较
        3,如果 equals 也相同 , 认为重复 , 此时不在给集合中存储 . 如果不相同 , 那么存储到集合中
例:图书馆存储图书信息
        属性:书名...
        
        当出现重复时,不存储
package com.qf.homework01;

public class Book {
	private  String bookname;
	private String writer;
	private String chubanshe;
	private int price;
	private String number;
	private String time;
	public Book() {
		super();
	}
	public Book(String bookname, String writer, String chubanshe, int price, String number, String time) {
		super();
		this.bookname = bookname;
		this.writer = writer;
		this.chubanshe = chubanshe;
		this.price = price;
		this.number = number;
		this.time = time;
	}
	public String getBookname() {
		return bookname;
	}
	public void setBookname(String bookname) {
		this.bookname = bookname;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getChubanshe() {
		return chubanshe;
	}
	public void setChubanshe(String chubanshe) {
		this.chubanshe = chubanshe;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
	@Override
	public String toString() {
		return "Book [bookname=" + bookname + ", writer=" + writer + ", chubanshe=" + chubanshe + ", price=" + price
				+ ", number=" + number + ", time=" + time + "]";
	}
	//重写方法
	
	@Override
	public int hashCode() {
		return bookname.hashCode()+writer.hashCode()+chubanshe.hashCode()+number.hashCode()+time.hashCode()+price;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj instanceof Book) {
			Book book = (Book) obj;
			if (this.bookname.equals(book.bookname)
					&&this.writer.equals(book.writer)
					&&this.chubanshe.equals(book.chubanshe)
					&&this.price==book.price
					&&this.number.equals(book.number)
					&&this.time.equals(book.time)) {
				return true;
			}
		}
		return false;
	}
}
package com.qf.homework01;

import java.util.HashSet;
import java.util.Set;

public class Test {
	public static  void main(String[] args) {
		HashSet<Book> books = new HashSet<Book>();
		Book book01 = new Book("四世同堂", "老舍", "北京大学出版社", 54, "10001", "1998.9.3");
		Book book02 = new Book("家", "巴金", "北京大学出版社", 30, "10002", "1998.7.15");
		Book book03 = new Book("四世同堂", "老舍", "北京大学出版社", 54, "10001", "1998.9.3");
		Book book04 = new Book("四世同堂", "老舍", "北京大学出版社", 54, "10001", "1998.9.3");
		books.add(book01);
		books.add(book02);
		books.add(book03);
		boolean a04 = books.add(book04);
		if (!a04) {
			System.out.println("第四本书籍重复");
		}
		for (Book book : books) {
			System.out.println(book);
		}
		
		
	}
}

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
package com.qf.homework04;
//比较器
import java.util.Comparator;
import java.util.TreeSet;

public class Test {
public static void main(String[] args) {
	TreeSet<Person> treeSet = new TreeSet<Person>(new Comparator<Person>() {
		public int compare(Person o1, Person o2) {
			int nameNum = o1.getName().compareTo(o2.getName());
			int sexNum = o1.getSex().compareTo(o2.getSex());
			int ageNum = o1.getAge()-o2.getAge();
			int numberNum = o1.getNumber()-o2.getNumber();
			return numberNum;	
		}		
	});
		Person person1 = new Person("张三", "男", 18, 220901);
		Person person2 = new Person("李四", "女", 21, 220905);
		Person person3 = new Person("王五", "男", 28, 220903);
		Person person4 = new Person("小花", "女", 19, 220902);
		Person person5 = new Person("老王", "男", 25, 220908);
		treeSet.add(person1);
		treeSet.add(person5);
		treeSet.add(person4);
		treeSet.add(person2);
		treeSet.add(person3);
		
		for (Person person : treeSet) {
			System.out.println(person);
		}
}
	
}

package com.qf.homework04;

public class Person {
	private String name;
	private String sex;
	private int age;
	private int number;
	public Person(String name, String sex, int age, int number) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.number = number;
	}
	public Person() {
		super();
	}
	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 getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", sex=" + sex + ", age=" + age + ", number=" + number + "]";
	}
	
}

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

.例:

, 使用 TreeSet 存入以下信息
        张三 男 18 220901
        李四 女 21 220905
        王五 男 28 220903
        小花 女 19 220902
        老王 男 25 220908
package com.qf.homework05;

import java.util.TreeSet;

//比较法

public class Test05 {
	public static void main(String[] args) {
		TreeSet<Person> treeSet = new TreeSet<Person>();
		Person person1 = new Person("张三", "男", 18, 220901);
		Person person2 = new Person("李四", "女", 21, 220905);
		Person person3 = new Person("王五", "男", 28, 220903);
		Person person4 = new Person("小花", "女", 19, 220902);
		Person person5 = new Person("老王", "男", 25, 220908);
		treeSet.add(person1);
		treeSet.add(person5);
		treeSet.add(person4);
		treeSet.add(person2);
		treeSet.add(person3);
		for (Person person : treeSet) {
			System.out.println(person);
		}
	}
}

package com.qf.homework05;

public class Person implements Comparable<Person> {
	private String name;
	private String sex;
	private int age;
	private int number;
	public Person(String name, String sex, int age, int number) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.number = number;
	}
	public Person() {
		super();
	}
	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 getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", sex=" + sex + ", age=" + age + ", number=" + number + "]";
	}
	@Override
	public int compareTo(Person o) {
		if (this.name == null||this.sex==null||age==0) {
			return 0;
		}
		int nameNum = this.getName().compareTo(o.getName());
		int sexNum = this.getSex().compareTo(o.getSex());
		int ageNum = this.getAge()-o.getAge();
		int numberNum = this.getNumber()-o.getNumber();
		return numberNum;	
	}
	
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值