Java序谈之HashSet类和TreeSet类

Set接口的特点?

1、无角标

2、不按顺序排列

3、元素不重复

Set接口分类?

HashSet类和TreeSet类

HashSet的作用、使用方式,存储特点?

作用:去除集合中重复元素

使用方式:在集合中元素所在集合中重写HashCode()方法、重写equals()方法

存储特点:每个集合中的元素会被分配一个哈希值,这个哈希值是元素特有的值,并且判断是否有相同的哈希值,如果存在进入equals方法

进行判断,是否是相同的元素,返回值类型是Boolean类型的

LinkedHashSet

可以在去除重复元素的同时,按照元素装填的顺序输出元素

需求:去除一些重复的对象

代码示例:

		LinkedHashSet<Person> hashSet = new LinkedHashSet<>();
		hashSet.add(new Person(18,"wang"));
		hashSet.add(new Person(17,"wang"));
		hashSet.add(new Person(19,"wangnn"));
		hashSet.add(new Person(20,"wangning"));
		hashSet.add(new Person(18,"wang"));
		System.out.println(hashSet);

HashCode()和equals()方法

代码示例:

	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return this.age;
	}
	@Override
	public boolean equals(Object obj) {
		Person p1 = (Person)obj;
		return  this.age==p1.age&&this.name.equals(p1.getName());
	}

需求:存入十个随机数(1~20),去掉重复

代码示例:

		HashSet<Integer> hashSet2 = new HashSet<>();
		while (hashSet2.size()<10) {
			int a = (int)(Math.random()*20)+1;
			hashSet2.add(a);
		}
		System.out.println(hashSet2);

Integer类中重写了HashCode()和equals()方法,这里不需要自己判断

需求:输入一个字符串,去掉重复的字符,打印出不同的字符

		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个字符:");
		String str = scanner.nextLine();
		char[] charArray = str.toCharArray();
		HashSet<Character> hashSet3 = new HashSet<>();
		for (int i = 0; i < charArray.length; i++) {
			hashSet3.add(charArray[i]);
		}
		System.out.println(hashSet3);
String类中重写了HashCode()和equals()方法,这里不需要自己判断

需求:操作原集合,使用ArrayList集合,完成去重的操作

代码示例:

 		ArrayList<String> arrayList = new ArrayList<>();
		arrayList.add("a");
		arrayList.add("a");
		arrayList.add("b");
		HashSet<String> hashSet4 = new HashSet<>();
		hashSet4.addAll(arrayList);
		arrayList.clear();
		arrayList.addAll(hashSet4);
		System.out.println(arrayList);

TreeSet类的作用、使用方式、存储特点?

作用:可以对集合进行排序

使用方式:建立一个类实现comparator接口,重写其中的compare方法,返回值类型是int型,并且在TreeSet初始化时候传入这个对象

存储特点:按照二叉树存储,当返回值大于0,存储在右边,当返回值小于0,存储在左边,当返回值=0,舍弃,一般也允许重复情况

需求:创建一个TreeSet添加几个数,查看效果,可以对整数排序

代码示例:

		TreeSet<Integer> treeSet = new TreeSet<>();
		treeSet.add(2);
		treeSet.add(2);
		treeSet.add(1);
		treeSet.add(3);
		treeSet.add(5);
		treeSet.add(4);
		treeSet.add(6);
		System.out.println(treeSet);

分析:integer类中已经实现了comparator接口,重写了compare方法

需求:将字符按照顺序排序

代码示例:

		TreeSet<String> treeSet = new TreeSet<>(new Comparator1());
		treeSet.add("aaa");
		treeSet.add("bbb");
		treeSet.add("ccc");
		treeSet.add("ss");
		System.out.println(treeSet);

比较器部分代码示例:
	public int compare(String o1, String o2) {
		int length = o1.length() - o2.length();
		int num = length ==0 ? o1.compareTo(o2) : length;
		return num == 0 ? -1 : num;
	}

分析:num返回0时候设置为-1,这样就保存了重复元素

需求:输入字符串,倒序打印

代码分析:

		TreeSet<Character> treeSet2 = new TreeSet<>(new Comparator2());
		String str1 = scanner.nextLine();
		char[] charArray2 = str1.toCharArray();
		for (int i = 0; i < charArray2.length; i++) {
			treeSet2.add(charArray2[i]);
		}
比较器部分代码示例:
	@Override
	public int compare(Character o1, Character o2) {
		int num = o2 - o1;
		return num == 0 ? 1 : num;
	}

需求:在一个ArrayList集合中存储了无序并且重复的字符串,要求排序,而且还不能去除重复

代码示例:

	public static void fun4() {
		ArrayList<String> arrayList = new ArrayList<>();
		arrayList.add("wangning");
		arrayList.add("wangning");
		arrayList.add("wang");
		arrayList.add("ning");
		arrayList.add("wangn");
		TreeSet<String> treeSet = new TreeSet<>(new Comparator2());
		treeSet.addAll(arrayList);
		arrayList.clear();
		arrayList.addAll(treeSet);
		System.out.println(arrayList);
	}

比较器部分代码示例:

	@Override
	public int compare(String o1, String o2) {
		// TODO Auto-generated method stub
		int length = o1.length() - o2.length();
		int num = length ==0 ? o1.compareTo(o2) : length;
		return num == 0?-1 :num ;

需求:接收一些整数,并且将这些数全部倒序打印出来

代码示例:

		HashSet<Integer> hashSet5 = new HashSet<>();
		while (hashSet5.size()<5) {
			String a1 = scanner.nextLine();
			if(a1.equals("quit")) {
				break;
			}
			hashSet5.add(Integer.parseInt(a1));
		}
		System.out.println(hashSet5);

比较器部分代码示例:

	@Override
	public int compare(Integer o1, Integer o2) {
		 int num = o1 - o2;
		return num == 0 ? o1 : num;
	}

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

代码示例:

public static void fun7() {
	Scanner scanner = new Scanner(System.in);
	TreeSet<Student> treeSet = new TreeSet<>(new Comparator5());
	for (int i = 0; i < 5; i++) {
		Student s1 = new Student();
		System.out.println("请输入信息");
		String name = scanner.nextLine();
		String [] array = new String[4];
		array = name.split(",");
		s1.setName(array[0]);
		s1.setChinese(Integer.parseInt(array[1]));
		s1.setMath(Integer.parseInt(array[2]));
		s1.setEnglish(Integer.parseInt(array[3]));
		s1.setTotal(s1.getChinese()+s1.getEnglish()+s1.getMath());
		treeSet.add(s1);
	}
	System.out.println(treeSet);
	scanner.close();
}
比较器部分代码示例:
	@Override
	public int compare(Student o1, Student o2) {
		// TODO Auto-generated method stub
		int num = o1.getTotal() - o2.getTotal();
		return num == 0 ? -1 : num;
	}

分析:这里需要建立一个Student类,分别对应五个属性,使用TreeSet类根据总成绩进行正向排序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值