java —— Set(TreeSet、HashSet)

一、Set集合

特点:无序(没有下标),不重复

HashSet: 去重的功能

TreeSet: 排序的功能

例1.

创建一个HashSet

保存 f f a a b b d d

HashSet<String> set = new HashSet<>();
		set.add("f");
		set.add("f");
		set.add("a");
		set.add("a");
		set.add("b");
		set.add("b");
		set.add("d");
		set.add("d");
		// 有序:存进去的顺序,就打印什么顺序
		// 迭代器遍历
		// Iterator<String> iterator = set.iterator();
		// while (iterator.hasNext()) {
		// String next = iterator.next();
		// System.out.println(next);
		// }
		// 增强for循环
		for (String string : set) {
			System.out.println(string);
		}
		System.out.println(set);

例2.

创建Set集合 保存6个人 两两重复

HashSet<Person> set = new HashSet<>();
		set.add(new Person("刘备", 12));
		set.add(new Person("刘备", 12));
		set.add(new Person("曹操", 15));
		set.add(new Person("曹操", 15));
		set.add(new Person("孙权", 14));
		set.add(new Person("孙权", 14));
		// 遍历集合
		for (Person person : set) {
			System.out.println(person);
		}

例3.

Linked 表示 有序(怎么存的 打印出来 还是那个顺序)

LinkedHashSet<String> set = new LinkedHashSet<>();
		set.add("f");
		set.add("f");
		set.add("a");
		set.add("a");
		set.add("b");
		set.add("b");
		set.add("d");
		set.add("d");
		for (String string : set) {
			System.out.println(string);
		}

例4.

编写一个程序,获得10个随机数,范围1~20,要求不能有重复的

有去除重复的,就用set

去重系统类的对象 不用操心那两个方法

HashSet<Integer> hashSet = new HashSet<>();
		while (hashSet.size() < 1) {
			int number = (int) (Math.random() * (20 - 1 + 1) + 1);
			hashSet.add(number);// 自动装箱
		}
		System.out.println(hashSet);

例5.

利用set集合a , b, c, d

去除ArrayList集合中的重复元素(操作原ArrayList)

ArrayList 保存a a ,b b ,c c ,d d

ArrayList<String> arrayList = new ArrayList<>();
		arrayList.add("a");
		arrayList.add("a");
		arrayList.add("b");
		arrayList.add("b");
		arrayList.add("c");
		arrayList.add("c");
		arrayList.add("d");
		arrayList.add("d");
		// 创建set集合
		LinkedHashSet<String> hashSet = new LinkedHashSet<>();
		hashSet.addAll(arrayList);
		arrayList.addAll(hashSet);
		System.out.println(arrayList);


二、TreeSet:作用是排序和去重复

例1.

创建一个TreeSet 添加几个数 查看效果

TreeSet<Integer> treeSet = new TreeSet<>();
		treeSet.add(10);
		treeSet.add(8);
		treeSet.add(15);
		treeSet.add(3);
		treeSet.add(15);
		System.out.println(treeSet);

例2.

创建一个TreeSet 添加4个人 查看效果

TreeSet<Person> set = new TreeSet<>();
		set.add(new Person("老王", 22));
		set.add(new Person("老李", 32));
		set.add(new Person("老赵", 42));
		set.add(new Person("老张", 52));
		System.out.println(set);
		System.out.println((int) '赵');
		System.out.println((int) '张');
		System.out.println((int) '李');
		System.out.println((int) '王');

例3.

集合中保存字符串 按字符串长度排序

使用比较器进行排序

在比较器中 写你的排序规则

利用TreeSet的构造方法

直接将比较器的实现类传进去

TreeSet<String> set = new TreeSet<>(new StringLengthImpl());
		set.add("凤兮凤兮归");
		set.add("故乡遨游四海求其凰");
		set.add("时未遇兮无所将何悟今兮升斯堂");
		set.add("有艳淑女在闺房室迩人遐毒我肠。(李白)");
		System.out.println(set);

例4.

 在一个集合ArrayList中存储了无序并且重复的字符串

 要求:排序,而且还不能去除重复,用比较器,操作ArrayList

ArrayList<String> arrayList = new ArrayList<>();
		arrayList.add("庆历四年春");
		arrayList.add("滕子京谪守巴陵郡");
		arrayList.add("越明年");
		arrayList.add("政通人和百废具兴");
		arrayList.add("越明年");
		// 在创建TreeSet的时候创建一个比较器
		TreeSet<String> treeSet = new TreeSet<>();
		// 把list全部装到treeSet中
		treeSet.addAll(arrayList);
		// 把arrayList清空
		arrayList.clear();
		arrayList.addAll(treeSet);
		System.out.println(arrayList);

例5.

键盘接收一个字符串, 程序对其中所有字符进行排序 要求保留重复的

System.out.println("请输入字符串:");
		Scanner scanner = new Scanner(System.in);
		String string = scanner.next();
		TreeSet<Character> treeSet = new TreeSet<>(new ComparatorImpl2());
		for (int i = 0; i < string.length(); i++) {
			treeSet.add(string.charAt(i));
		}
		System.out.println(treeSet);

例6.

程序启动后, 可以从键盘输入接收多个整数,

直到输入quit时结束输入.

把所有输入的整数倒序排列打印.

Scanner scanner = new Scanner(System.in);
		System.out.println("请输入整数:");
		String string = scanner.next();
		//创建一个带比较器的treeSet
		TreeSet<Integer> treeSet = new TreeSet<>(new IntImpl());
		while (!string.equals("quit"))
		{
			int temp = Integer.parseInt(string);
			treeSet.add(temp);
			string = scanner.next();

例7.

键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。

System.out.println("请按照格式输入学生成绩:");
		Scanner scanner = new Scanner(System.in);
		TreeSet<Student> treeSet = new TreeSet<>(new studentImpl());
		for(int i = 0; i<5;i++)
		{
		String string = scanner.next();
		String[] array = new String[4];
		 array = string.split(",");
		Student student = new Student(array[0], array[1], array[2], array[3]);
	     treeSet.add(student);
		}
		System.out.println(treeSet);
public class Person implements Comparable<Person> {
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	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 "Person [name=" + name + ", age=" + age + "]";
	}
	// 重写HashCode
	// 只要创建对象 就给每一个对象分配一个HashCode码
	// 当太监到set中的对象 hashCode不相同时
	// 没有调用equals方法 并且对象直接存到set集合中
	// 当"hashCode码相同的时候 会调用equals方法
	// 来查看是否是同一个对象 是 就不存进去 反之 存进去
	/*@Override
	public int hashCode() {
		System.out.println("hashCode 被调用了");
		//  返回一个固定 让所有创建出来的Person对象
		// hashCode码都一样
		// 返回固定值 效率不高(equals每次都会被调用)
		return this.age;
	}
	
	
	// 重写equals方法
	@Override
	public boolean equals(Object obj) {
		System.out.println("equals被调用");
		Person p = (Person) obj;
		return this.age == p.getAge() &&
				this.name.equals(p.getName());
	}
	*/
	@Override
	public int hashCode() {
		// 复杂度 是为了减少hashCode码 重复
		// 提高曹操时候 调用equals方法的效率
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		// 防御性判断 利用判断提交效率
		if (this == obj)// 如果两个东西都在相同
			return true;// 肯定是同一个东西
		if (obj == null)// 传进来不是空(调用方法东西肯定不是空的)
			return false;// 不是一个对象
		// 判断两个东西 是否是 同一个类创建出来的对象
		if (getClass() != obj.getClass())
			return false;
		// 向下转型
		Person other = (Person) obj;
		// 判断年龄
		if (age != other.age)
			return false;  
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	/*
	 *返回0 只一个元素
	 *返回整数时 :打印的数据 正序输出
	 *返回负数时:打印的数据 倒序输出
	 *
	 *TreeSet 二叉树
	 *存储规则
	 *比我小的数 放到我的左边(返回负数的情况)
	 *比我大的数 放到我的右边(返回正数的情况)
	 *返回的是0 就不存储
	 *输出规则
	 *以升序输出
	 *
	 *treeset在存储的时候
	 *只跟compareTo 方法的返回值有关
	 *
	 *TreeSet排序步骤
	 *1.实现接口
	 */
	@Override
	public int compareTo(Person o) {
		// 按年龄排序
//		return this.age - o.getAge();
		// 按姓命排序
		return this.name.compareTo(o.getName());
		// 主要按年龄排序 次要按姓名排
//		int number = this.getAge()-o.getAge();
//		return number == 0 ? this.name.compareTo(o.name) : number;
	}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值