前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >集合框架【第二章】——Set(HashSet与TreeSet)

集合框架【第二章】——Set(HashSet与TreeSet)

作者头像
用户10196776
发布2022-11-22 14:19:16
2030
发布2022-11-22 14:19:16
举报
文章被收录于专栏:SpringBoot+MyBatis前端

首先:由一个问题来展开(问题:元素是被覆盖还是过滤)需要用到实体类

//看看实体类吧!

代码语言:javascript
复制
public class Student implements Serializable,Comparable<Student>{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer sid;
	private String sname;
	private Float score;
	public Integer getSid() {
		return sid;
	}
	public void setSid(Integer sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public Float getScore() {
		return score;
	}
	public void setScore(Float score) {
		this.score = score;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((score == null) ? 0 : score.hashCode());
		result = prime * result + ((sid == null) ? 0 : sid.hashCode());
		result = prime * result + ((sname == null) ? 0 : sname.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		//true代表已存在,false代表允许添加(不存在)
		//当前对象是否与obj对象相同
		if (this == obj)
			return true;
		//obj对象是否为空
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		//当前对象类型与obj对象类型不相同
		Student other = (Student) obj;
		if(this.getSid()==other.getSid()) {
			return true;
		}
		return true;
	}
	public Student(Integer sid, String sname, Float score) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.score = score;
	}
	public Student() {
		super();
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", score=" + score + "]";
	}
	/*@Override
	public int compareTo(Student o) {
		return -(this.getSid()-o.getSid());
	}*/
	@Override
	public int compareTo(Student o) {
		//比较者大于被比较者返回1
		//比较者等于被比较者返回0
		//比较者小于被比较者返回-1
		/*if(this.getSid()>o.getSid()) 
			return 1;
		else {
			if(this.getSid()==o.getSid()) 
				return 0;
			else 
				return -1;
			}*/
		
		//return this.getSid()-o.getSid();
		return this.getSname().hashCode()-o.getSname().hashCode();
		}	

//在这里(可能)需要用到一个快捷键 (shift+alt+s)如图所示:

接下来就是他的测试方法(也涵盖了Set的特点的例子代码)

1. Set   1.1 特点:无序、对象不能重复   1.2 遍历     1.2.1 foreach     1.2.2 迭代器      1.3 常用实现类       HashSet

代码语言:javascript
复制
package com.zking.Collection.util;

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

import com.zking.Collection.entity.Student;

public class Demo1 {

	public static void main(String[] args) {
		//Set
		//1.特点:无序,唯一
		//1)无序:元素添加的顺序与输出的不一致
		//2)唯一:不允许添加重复元素(被过滤掉了)
		//问题:元素是被覆盖还是过滤
		/*Set<String> set=new HashSet<>();
		set.add("a");
		set.add("b");
		set.add("c");
		set.add("d");
		
		set.forEach(System.out::println);*/
		
		Set<Student> set=new HashSet<>();
		set.add(new Student(1, "a", 100f));
		set.add(new Student(2, "b", 70f));
		set.add(new Student(3, "c", 80f));
		set.add(new Student(1, "a", 90f));
		
		//1)默认使用equals比较,Object类型是引用类型,默认比较的是内存地址
		//2)重新hashcode和equals方法,先比较hashcode值是否相同,再比较equals
		//2.1)hashcode值相同,则比较equals
		//2.2)hashcode值不相同,则不比较equals
		/*Student stu=new Student();
		stu.equals(null);*/
		//set.forEach(System.out::println);
		//2.遍历方式(2种)
		//1)foreach
		for(Student student: set) {
			System.out.println(student);
		}
		System.out.println("-------------");
		//2)iterator(迭代器)
		//获取迭代器
		Iterator<Student> it= set.iterator();
		//循环遍历
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

  TreeSet:根据某种(规则)对里面的元素进行排序         自然比较接口: java.lang.Comparable          String以AscII码进行比较,返回差值

以下就是TreeSet的代码案例(进行升序降序....)

代码语言:javascript
复制
public static void main(String[] args) {
		//TreeSet:以某种特定的规则对集合中的某种元素进行排序(升序和降序)
		//java.lang.Comparable:自然比较接口
		//java.util.Comparator:比较器(推荐)
		
		/*Set<String> set=new TreeSet<>();
		set.add("hh");
		set.add("mm");
		set.add("zz");
		set.add("dd");*/
		
		Set<Student> set=new TreeSet<>(new NameComparator());
		set.add(new Student(1, "hh", 100f));
		set.add(new Student(2, "mm", 70f));
		set.add(new Student(3, "zz", 80f));
		set.add(new Student(1, "dd", 90f));
		set.forEach(System.out::println);
		
	}

比较器: java.util.Comparator(代码案例如下)

代码语言:javascript
复制
package com.zking.Collection.util;

import java.util.Comparator;

import com.zking.Collection.entity.Student;

public class NameComparator implements Comparator<Student> {


	@Override
	public int compare(Student o1, Student o2) {
		// TODO Auto-generated method stub
		return o1.getSid()-o2.getSid();
	}

}

 代码中已存在注释可要细致看看哦

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先:由一个问题来展开(问题:元素是被覆盖还是过滤)需要用到实体类
  • //在这里(可能)需要用到一个快捷键 (shift+alt+s)如图所示:
  • 比较器: java.util.Comparator(代码案例如下)
  •  代码中已存在注释可要细致看看哦
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档