常见对象-day12

170 阅读4分钟

day12-集合框架 Set

1 HashSet和LinkedHashSet

  • 无索引,不能重复,无序
    • LinkedHashSet
      • 底层是链表结构,是Set集合中唯一一个保证怎么存就怎么取的集合对象
      • 其它的原理和HashSet一样
  • HashSet关于对象减少次数的方法
/*
创建学生类对象,使用HashSet来存储学生类对象,打印出来的成员被全部打印出来,因为每个成员的Hash地址值不同,那如何让做才能去除重复的成员呢?可以使用HashCode和equal方法
*/
package com.hui.bean;

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;
	}
	
	@toString.java
	public String toString() {
		return "[name=" + name + ", age=" + age + "]";
	}
	@hashcode.java
	/*
	hashcode和equals在这里时共用的,目的是尽量较少代码的运行,并将重复次数减为1次出
	*/
	public int hashCode() {
		final int prime = 31;     //随意选的,31为质数,且不大不小
		int result = 1;           //随意返回一个整数
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		//返回0的意思是对象相同了,返回1表示1不相同
		//返回整数表示顺序输出1,返回负数表示倒序输出,返回0表示相等
		return result;
	}
	@equals.java
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) 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;
	}	
}


//主函数
import com.hui.bean.Student;
import java.util.HashSet;
class DemoRandom {
    public static void main(String[] Args) {
        HashSet<Student> ha=new HashSet<>();
        ha.add(new Student("张三",23));
        ha.add(new Student("张三",23));
        ha.add(new Student("张三",23));
        ha.add(new Student("李四",24));
        ha.add(new Student("李四",24));
        ha.add(new Student("王五",25));
        ha.add(new Student("王五",25));
        ha.add(new Student("王五",25));
        ha.add(new Student("王五",25));
        System.out.println(ha);     //整体输出
        for(Student s:ha) {         //遍历输出
            System.out.println(s);
        }
    }
}
/*
需求:编写一个程序,获取10个1~20的随机数,要求随机数不能重复,并把随机数输出到控制台
分析:
1 创建随机数对象
2 创建HashSet对象
3 判断Hashset对象里的元素是否有10个
4 获取10个1~20的随机数
5,在控制台上打印
*/
import java.util.HashSet;
import java.util.Random;
class DemoRandom {
    public static void main(String[] Args) {
        Random r=new Random();               //创建随机数对象
        HashSet<Integer> hs=new HashSet<>(); //创建HashSet对象
        while(hs.size()<10) {                //判断Hashset对象里的元素是否有10个
            hs.add(r.nextInt(20)+1);         //获取10个1~20的随机数
        }
        System.out.println(hs);              //在控制台上打印
    }
}
/*
需求:使用Scanner从键盘录入一行输入,去掉重复的字符,顺序打印出来
分析:
1 创建Scanner对象
2 创建LinkedHashset对象
3 将键盘录入字符串转换为字符数组
4 对字符数组进行遍历
5 将遍历后的字符数组添加到LinkedHashset对象中
6 打印输出
*/
import java.util.LinkedHashSet;
import java.util.Scanner;
class DemoRandom {
    public static void main(String[] Args) {
        Scanner sc=new Scanner(System.in);                //创建Scanner对象
        System.out.println("请录入一行字符");
        LinkedHashSet<Character> lhs=new LinkedHashSet<>();//创建LinkedHashset对象
        char[] arr=sc.nextLine().toCharArray();           //将键盘录入字符串转换为字符数组
        for(int i=0;i<arr.length;i++) {                   //对字符数组进行遍历
            lhs.add(arr[i]);                              //将遍历后的字符数组添加到LinkedHashset对象中
        }
        System.out.println(lhs);                          //打印输出
    }
}

2 TreeSet

  • 特点:对元素进行排序,也保证元素的唯一
  • TreeSet集合在对元素自动排序时:
    • 1 如果是整数,其是按照数值大小排序的
    • 2 如果是自定义对象,像("张三",23),TreeSet并不知道该如何对其进行比较,此时需要引入比较器Comparable,但是要重写compareTo方法。注意,compareTo是按照字典顺序进行排序的。如果要对长度进行排序,需要继承Comparator接口
    • 3 Comparator接口下的compareTo
      • int comparetor(T o1,T o2)
package com.hui.bean;

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;
	}
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int compareTo(Student o) {
		return 0;    //测试返回值为正数以及倒数时的情况
/*
TreeSet集合在对元素自动排序时:
1 如果是整数,其是按照数值大小排序的
2 如果是自定义对象,像("张三",23),TreeSet并不知道该如何对其进行比较,此时需要引入比较器Comparable,但是要重写compareTo方法
Treeset为二叉树
当compareTo返回值为0时,集合中只有一个元素
当compareTo返回值为正数时,集合中怎么存就怎么取
当compareTo返回值为负数时,集合中倒序存储
*/
	}	
}

import com.hui.bean.Student;
import java.util.TreeSet;
class DemoTreeSet {
    public static void main(String[] Args) {
        TreeSet<Student> ts=new TreeSet<>();
        ts.add(new Student("张三",23));
        ts.add(new Student("张三",23));
        ts.add(new Student("李四",24));
        ts.add(new Student("李四",24));
        ts.add(new Student("李四",24));
        ts.add(new Student("王五",25));
        ts.add(new Student("王五",25));
        System.out.println(ts);
    }
}