Set集合详解-程序员宅基地

技术标签: Java EE  算法  java  java-ee  开发语言  eclipse  

目录

一.set简介

二.set集合的特点

1.Set不存储重复的元素

2.Set中的元素通常是无序的

三.set集合的遍历方式

1.foreach遍历

2.iterator迭代器遍历

四.HashSet哈希表存储,重复元素存储底层原理

五.LinkedHashSet保留元素插入顺序

六.TreeSet(自然排序,比较器排序)

1.默认排序:set集合中的默认的排序

2.自然排序:实现java.lang.Comparable接口

3.比较器排序:实现java.util.Comparator的匿名内部类

七.SortedSet 

1.first()和last()方法分别获取了集合中的最小值和最大值。

2.subSet()方法获取了子集合

3.tailSet()方法尾部子集合


一.set简介

在Java中,Set是一个接口,用于存储一组不重复的元素。Set接口继承自Collection接口,因此它具有Collection接口定义的所有方法,例如添加、删除和迭代等。

二.set集合的特点

1.Set不存储重复的元素

2.Set中的元素通常是无序的

package com.ctb.set;

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

/**
 * set集合的特点 
 * 1.无序-没有下标--所以无法修改 
 * 2.元素无重复
 * 
 * @author biao
 *
 */
public class Demo1 {
	public static void main(String[] args) {
		//定义set集合
		Set set=new HashSet<>();
		//增加
		set.add("ha");
		set.add("ds");
		set.add("dh");
		set.add("es");
		set.add("di");
		//删除
		set.remove("di");
System.out.println(set.size()); //输出:4
		//查询
		System.out.println(set);//输出[dh, ha, es, ds]
	}
}

三.set集合的遍历方式

1.foreach遍历

2.iterator迭代器遍历

package com.ctb.set;

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

/**
 * set集合的遍历方式
 * 1.foreach遍历
 * 2.iterator迭代器遍历
 * @author biao
 *
 */
public class Demo2 {
	public static void main(String[] args) {
		//定义set集合
				Set set=new HashSet<>();
				//增加
				set.add("花花");
				set.add("曹操");
				set.add("苹果");
				//foreach遍历
				for (Object object : set) {
					System.out.println(object);//输出:花花 苹果 曹操
				}
				System.out.println("------------------------------------");
				//iterator迭代器遍历
				Iterator it = set.iterator();
				while (it.hasNext()) {
					System.out.println(it.next());//输出:花花 苹果 曹操
				}
	}

}

四.HashSet哈希表存储,重复元素存储底层原理

Set集合中元素是不重复的,但在我们存储对象过程中,对象是可以重复添加的,那么,我们 需要重写存储对象中的hashcode方法和equals方法,它会在hashCode方法中进行筛选,再到equals方法进行判断

注:若只重写一个方法,则无法避免存储对象重复的添加

package com.ctb.set;

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

/**
 * set集合对象去重底层原理
 * 先进入hashcode方法进行筛选,后进入equlas方法判断
 * @author biao
 *
 */
public class Demo3 {
	public static void main(String[] args) {
		Set set = new HashSet<>();
		set.add(new Cat(1, "土猫"));
		set.add(new Cat(2, "哈士奇"));
		set.add(new Cat(3, "翔子猫"));
		set.add(new Cat(4, "毛猫"));
		// System.out.println(set.contains(new Cat(2, "哈士奇")));//false
		set.add(new Cat(2, "哈士奇"));
		for (Object object : set) {
			System.out.println(object); //输出结果:Cat [id=4, name=毛猫]
			                           // Cat [id=3, name=翔子猫]
			                          // Cat [id=1, name=土猫]
									 // Cat [id=2, name=哈士奇]
		}

	}
}

class Cat {
	private int id;
	private String name;

	public Cat() {
		// TODO Auto-generated constructor stub
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Cat [id=" + id + ", name=" + name + "]";
	}

	public Cat(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		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;
		Cat other = (Cat) obj;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}

五.LinkedHashSet保留元素插入顺序

LinkedHashSet是基于链表和哈希表的实现,它保留了元素插入的顺序,通过哈希表来实现元素的快速查找。

package com.ctb.set;

import java.util.LinkedHashSet;
import java.util.Set;
/**
 * LinkedHashSet
 * 元素插入排序
 * @author biao
 *
 */
public class Demo5 {
	public static void main(String[] args) {
		Set set = new LinkedHashSet<>();
		set.add("花花");
		set.add("鸟鸟");
		set.add("猫猫");
		set.add("哈哈");
		for (Object object : set) {
			System.out.println(object);// 输出:花花 鸟鸟 猫猫 哈哈
		}
	}
}

六.TreeSet(自然排序,比较器排序)

1.默认排序:set集合中的默认的排序

2.自然排序:实现java.lang.Comparable接口

3.比较器排序:实现java.util.Comparator的匿名内部类

package com.ctb.set;

import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

/**
 * set集合排序
 * @author biao
 *
 */
public class Demo4 {
	public static void main(String[] args) {
		Set set =new TreeSet<>();
		set.add(new Cart(1, "麻辣", 19));
		set.add(new Cart(2, "香甜", 32));
		set.add(new Cart(3, "可口", 23));
		set.add(new Cart(4, "酸辣", 45));
		set.add(new Cart(5, "苦逼", 23));
		set.add(new Cart(6, "咸蛋", 23));
		System.out.println("-------set集合默认排序---------");
		//默认排序
		for (Object object : set) {
			System.out.println(object);
		}
		
		//自然排序
		Set ts=new TreeSet<>();
		//添加数据
		for (Object object : set) {
			ts.add(object);
		}
		System.out.println("------java.lang.Comparable自然排序-------");
		for (Object object : ts) {
			System.out.println(object);
		}
		
		//比较排序--根据价格排序
		Set s=new TreeSet<>(new Comparator<Cart>() {
			@Override
			public int compare(Cart o1, Cart o2) {
				// TODO Auto-generated method stub
				return o2.getPrice()-o1.getPrice();
			}
		});
		//添加数据
		for (Object object : set) {
			s.add(object);
		}
		System.out.println("---------java.util.Comparator的匿名内部类-按价格排序--------");
		for (Object object : s) {
			System.out.println(object);
		}
		
		//比较排序--先根据价格排序--价格相同则按id排序
				Set ss=new TreeSet<>(new Comparator<Cart>() {
					@Override
					public int compare(Cart o1, Cart o2) {
						// TODO Auto-generated method stub
						int n=o2.getPrice()-o1.getPrice();
						if (n==0) {
							return o1.getId()-o2.getId();
						}
						return n;
					}
				});
				//添加数据
				for (Object object : set) {
					ss.add(object);
				}
				System.out.println("---------java.util.Comparator的匿名内部类-先价格,再id排序--------");
				for (Object object : ss) {
					System.out.println(object);
				}
	}

}
class Cart implements Comparable<Cart>{
	private int id;
	private String name;
	private int price;
	public Cart() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Cart [id=" + id + ", name=" + name + ", price=" + price + "]";
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public Cart(int id, String name, int price) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + price;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cart other = (Cart) obj;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (price != other.price)
			return false;
		return true;
	}
	@Override
	public int compareTo(Cart o) {
		return this.id-o.id;
	}

}

输出:

七.SortedSet 

1.first()和last()方法分别获取了集合中的最小值和最大值。

2.subSet()方法获取了子集合

subSet()方法的第一个参数inclusive,第二个参数exclusive,即包含起始元素但不包含结束元素

3.tailSet()方法尾部子集合

package com.ctb.set;

import java.util.LinkedHashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
/**
 * SortedSet
 * @author biao
 *
 */
public class Demo5 {
	public static void main(String[] args) {
		SortedSet<Integer> set = new TreeSet<>();
		set.add(1);
		set.add(2);
		set.add(3);
		set.add(4);
		set.add(5);

		System.out.println( set.first()); // 1
		System.out.println( set.last()); // 5

		SortedSet<Integer> subSet = set.subSet(2, 4);
		System.out.println(subSet); // [2, 3]

		SortedSet<Integer> tailSet = set.tailSet(3);
		System.out.println( tailSet); // [3, 4, 5]
	}
}

祝大家在梦想之路披荆斩棘!! 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_74268571/article/details/131217733

智能推荐

内存卡选购指南_tf卡三围-程序员宅基地

文章浏览阅读331次。TF卡也叫Micro SD卡。也就是小型SD卡。SD卡的三围大概是24mm3*2mm*2.1mm.而TF卡体积缩小到15mm*11mm*1mm.这里华为还推出了更小体积的NM存储卡,比TF卡更小。可以直接放在SIM卡里使用。但价格比较高。:最常用的存储卡设备。体积小,被广泛地于使用便携式装置上,例例如数码相机、平板电脑和多媒体播放器MP3,MP4,行车记录仪等。:主要用于相机等拍摄设备。体积比SD卡大,但安全性和稳定性传输速度上更高。当然价格也更高。_tf卡三围

Mybatis 与Mybatis-plus同时引入同一个项目中配置方法_mybatisplus和mybatis可以一起导入吗-程序员宅基地

文章浏览阅读8.1k次,点赞5次,收藏31次。原项目系统中已经引入了 Mybatis 和 pagehelper ,当引入Mybatis-plus 后启动项目报错 SqlSessionFactory 错误,排查原因后为依赖冲突导致,需排除部分jar包,并修改相关配置。5. 修改配置文件,将原 mybatis 改成 mybatis-plus。根据自己xml的实际路径修改。4.引入autoconfigure。3.引入Mybatis-plus。2. pagehelper 中。1.mybatis中。_mybatisplus和mybatis可以一起导入吗

Windows磁盘管理工具DiskPart创建VHD以及虚拟磁盘的挂载及盘符分配_vhd工具-程序员宅基地

文章浏览阅读2.3k次。使用diskpart磁盘工具创建VHD虚拟磁盘以及磁盘的挂载、格式化及驱动器盘符分配。_vhd工具

Qt Data Visualization_shadows are not yet supported for opengl es2-程序员宅基地

文章浏览阅读501次。Qt Data Visualization 专栏链接地址:Qt Data Visualization 3D可视化https://blog.csdn.net/qq_36583051/article/details/107627747Q3DBarshttps://blog.csdn.net/qq_36583051/article/details/107790125_shadows are not yet supported for opengl es2

python中keys返回什么类型_dict.viewkeys()返回的数据类型是什么?[Python2.7]-程序员宅基地

文章浏览阅读2.5k次。如果进入外壳:print type(dct.viewkeys())它将返回:dict_keys是一个Dictionary view对象,在Python 2.7中是新的。从PEP 3106:The dictionary methods keys(), values(), and items() are different in Python 3.x. They return an object ca..._dict.viewkeys方法

学堂在线Java程序设计编程题第一章节_学堂在线java程序设计清华大学 编程题答案-程序员宅基地

文章浏览阅读994次。字符串排序:用Java编写一个能对一组字符串按字典序升序排序的程序 输入为N和N行字符串,需要按行输出字符串升序排序的结果输入:3 Abc Abe Abd输出:Abc Abd Abeimport java.io.*;import java.util.*;import java.math.*;public class Main { public stati..._学堂在线java程序设计清华大学 编程题答案

随便推点

c语言链表查找成绩不及格,【查找链表面试题】面试问题:C语言学生成绩… - 看准网...-程序员宅基地

文章浏览阅读186次。该系统基于C语言,运用了指针、结构体和文件读写等技术路线实现了一些功能:包括(输入学生数据,修改学生数据,查找学生资料,排列学生数据,保存学生成绩,调出学生成绩,显示学生资料等7个功能)1、首先,定义学生结构体:typedef struct Link{int number;char name[10];char sex[4];int Chinese;int English;int Match;..._goto endp

计算机网络:20 网络应用需求_应用对网络需求-程序员宅基地

文章浏览阅读4.7k次。网络应用的需求与传输层服务网络应用对传输服务的需求:数据丢失/可靠性某些网络应用能够容忍一定的数据丢失:网络电话某些网络应用要求百分之百可靠的数据传输:文件传输,telnet时间延迟有些应用只有在延迟足够低时才有效网络电话/网络游戏带宽:某些应用只是有在带宽达到最低要求时才有效:网络视频某些应用能够适应任何带宽-------弹性应用:eamilInternet提供的传输服务TCP服务:面向连接:客户机/服务器进程间需要建立连接可靠传输流量控制:发送方不会发送速度过快,超过接收_应用对网络需求

BEVFusion论文解读-程序员宅基地

文章浏览阅读2.3k次。本文将介绍MIT韩松课题组在自动驾驶方面的最新工作,他们提出了一种高效且通用的多任务多传感器融合框架BEVFusion。它统一了共享鸟瞰(BEV)表示空间中的多模态特征,很好地保留了几何信息和语义信息。_bevfusion

multisim怎么设置晶体管rbe_山东大学 模电实验 实验一:单极放大器 - 图文 --程序员宅基地

文章浏览阅读1.7k次。实验一:单机放大器附件:实验前准备工作共发射极放大电路的分析与综合 一、电路原理图二、直流分析如图,β=2002. 欲使UCQ=6V,求:Pot1URc?Vcc?UCQ?12V?6V?6VICQ?ICQURc?1.176mA RCIBQ???5.882?AUCEQ?Vcc?IEQ?Re1?Re2??ICQR3?VCC?ICQ(R3?Re1?Re2)?4.68V UB?UBE?IEQ(Re1?Re2...

华为OD机试真题-灰度图恢复-2023年OD统一考试(C卷)-程序员宅基地

文章浏览阅读1.7k次,点赞20次,收藏10次。3、从第三个数开始,每两个数一组,每组第一个数是灰阶值,第二个数表示该灰阶值从左到右,从上到下(可理解为将二维数组按行存储在一维矩阵中)的连续像素个数。输入包括两行,第一行是灰度图压缩数据,第二行表示一个像素位置的行号和列号,如:0 0 表示左上角像素。1、系统保证输入的压缩数据是合法有效的,不会出现数据越界、数值不合法等无法恢复的场景;2、系统保证输入的像素坐标是合法的,不会出现不在矩阵中的像素;请从输入的压缩数恢复灰度图原始矩阵,并返回指定像素的灰阶值。输入数据表示的灰阶矩阵的指定像素的灰阶值。

【机器学习】(周志华--西瓜书) 真正例率(TPR)、假正例率(FPR)与查准率(P)、查全率(R)_真正例率和假正例率,查准率,查全率,概念,区别,联系-程序员宅基地

文章浏览阅读1.7w次。Q:试述真正例率(TPR)、假正例率(FPR)与查准率(P)、查全率(R)之间的联系。查全率: 真实正例被预测为正例的比例真正例率: 真实正例被预测为正例的比例显然查全率与真正例率是相等的。查准率:预测为正例的实例中真实正例的比例假正例率: 真实反例被预测为正例的比例两者并没有直接的数值关系。敏感度,召回率,命中率或真实阳性率(TPR)特异性,选择性或真阴..._真正例率和假正例率,查准率,查全率,概念,区别,联系

推荐文章

热门文章

相关标签