自己动手系列----使用数组实现一个简单的Set
Set:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。主要有HashSet和TreeSet两大实现类。
Set:
在判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现。
HashSet是哈希表结构,主要利用HashMap的key来存储元素,计算插入元素的hashCode来获取元素在集合中的位置;
TreeSet是红黑树结构,每一个元素都是树中的一个节点,插入的元素都会进行排序;
下面展示部分代码:
private E arrElementE[];
private int size; @SuppressWarnings("unchecked")
public ArrImplSet() {
arrElementE = (E[]) new Object[0];
} public ArrImplSet(E [] arr) {
arrElementE = arr;
size = arrElementE.length;
}
/**
* 添加元素
* @param element
*/
public void addElement(E element) {
// 判断元素是否存在
if (!contains(element)) {
// 数组是否满了,需要扩容
if (size == arrElementE.length) {
incrementArray();
}
arrElementE[size ++] = element;
}
}
/**
* 返回 集合长度
* @return
*/
public int size() {
if (arrElementE != null) {
return arrElementE.length;
}else {
return 0;
}
}
/**
* 清空集合
*/
public void clear() {
arrElementE = null;
} public String toString() {
if(arrElementE == null || arrElementE.length == 0) {
return "empty";
}else {
StringBuilder str = new StringBuilder("[");
for (int i = 0; i < arrElementE.length; i++) {
str.append(arrElementE[i]+ ",");
}
str.append("]");
return str.toString();
}
} /**
* 数组扩容
*/
@SuppressWarnings("unchecked")
private void incrementArray() {
E [] tempArrEs = arrElementE;
arrElementE = (E[]) new Object[size + 10 ];
System.arraycopy(tempArrEs, 0, arrElementE, 0, size);
} /**
* 判断元素是否存在,注意。Set 是可以保存null。
* @param el
* @return
*/
public boolean contains(E el) {
if (null == el) {
// 是否已存在null
for (int i = 0; i < size; i++)
if (arrElementE[i] == null)
return true;
}else {
for (int i = 0; i < size; i++)
if (arrElementE[i] == el)
return true;
}
// 都不存在,返回false
return false;
}
/**
* 返回
* @param index
* @return
*/
public E get(int index) {
if(size <= index) {
throw new IndexOutOfBoundsException("下标越界了,index:"+index);
}
return arrElementE[index];
} public static void main(String[] args) {
// ArrImplSet<String> set = new ArrImplSet<String>();
// set.addElement("abcdefg");
// set.addElement("abcdefg");
// set.addElement("abc5efg");
// set.addElement("null");
// System.out.println(set.toString()); ArrImplSet<Integer> set = new ArrImplSet<Integer>();
set.addElement(1);
set.addElement(2);
set.addElement(1);
set.addElement(null);
// System.out.println(set.toString());
for (int i = 0; i < set.size; i++) {
System.out.println(set.get(i));
} }
自己动手系列----使用数组实现一个简单的Set的更多相关文章
- 自己动手系列----使用数组实现一个简单的Map
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同.Java 语言中提供的数组是用来存储固定大小的同类型元素. 这里提一下,数组的优缺点: 优点: 1. 使用索 ...
- 动手造轮子:实现一个简单的 EventBus
动手造轮子:实现一个简单的 EventBus Intro EventBus 是一种事件发布订阅模式,通过 EventBus 我们可以很方便的实现解耦,将事件的发起和事件的处理的很好的分隔开来,很好的实 ...
- 动手造轮子:实现一个简单的 AOP 框架
动手造轮子:实现一个简单的 AOP 框架 Intro 最近实现了一个 AOP 框架 -- FluentAspects,API 基本稳定了,写篇文章分享一下这个 AOP 框架的设计. 整体设计 概览 I ...
- BAT面试题:使用数组实现一个简单的阻塞队列
这道题是我亲身经历的一道大厂面试题,非常值得分享! 这道题可以分为两个步骤进行编码解答,第一步是基于数组实现一个队列,第二步是实现线程阻塞. 如果是基于数组实现栈的数据结构,那么我们只需要一个指针进行 ...
- Tomcat详解系列(1) - 如何设计一个简单的web容器
Tomcat - 如何设计一个简单的web容器 在学习Tomcat前,很多人先入为主的对它的认知是巨复杂的:所以第一步,在学习它之前,要打破这种观念,我们通过学习如何设计一个最基本的web容器来看它需 ...
- 【 D3.js 入门系列 --- 3 】 做一个简单的图表!
前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...
- JBoss 系列七十:一个简单的 CDI Web 应用
概述 本文通过一个简单的 CDI Web 应用演示dependency injection, scope, qualifiers 以及EL整合.应用部署完成后我们可以通过http://localhos ...
- 【 D3.js 入门系列 — 3 】 做一个简单的图表!
图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...
- python爬虫系列(1)——一个简单的爬虫实例
本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片. 1. 概述 本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片.下载图片的步骤如下: 获取网页html文本内容:分析html中 ...
随机推荐
- Oracle12c传统数据库模式 OGG
OGG12C 配置 环境配置: 安装数据库Oracle12c 安装源端OGG:oggs PORT:7809 安装目标端OGG:oggt PORT:7909 源端和目标端地址:127.0.0.1 ...
- 使用IDA pro逆向ARM M系核心的Bin固件
使用IDA pro逆向ARM M系核心的Bin固件 物联网和智能设备这两年还是比较火的,我们的手中或多或少都有了几个智能设备,比如手环,智能手表,或者门锁什么之类的东西,但是同学们在做逆向的时候, ...
- 学习linux/unix编程方法的建议,学习Linux的四个步骤(转)
解答:学习Linux的四个步骤假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过我想大概可以分为4个阶段,水平从低到高从安装使用=>linux ...
- 在vue中使用elementUI饿了么框架使用el-calendar日历组件,实现自定义显示备忘录标注
饿了么官网给的自定义例子是点击哪个日期在日期后面加个勾 而我们想要的是显示备忘录,像这样↓,日历上直接显示 这时候我们要把template里的代码改一下 <el-calendar> < ...
- 关于Spring注入参数到static静态参数失败问题处理。解决Autowired annotation is not supported on static fields的问题
直接贴代码 把注入参数的注解加到set方法上面去即可. 因为这是一个工具类用到的config,所以一开始没有加@Component,还是依然为空,加上之后就正常能注入了
- 复习mongoose的基本使用
mongodb参考 mongoose官网 mongoose用起来更便捷,更方便些
- vue 富文本编辑器 项目实战用法
1.挑个富文本编辑器 首先针对自己项目的类型,确定自己要用啥编辑器. 1.1 wangeditor 如果一般类似博客这种项目不需要花里胡哨的,功能也不要求贼多的,推荐一下wangeditor(点击跳转 ...
- CentOS 编译安装 PyCrypto
转载自:http://bugcharmer.blogspot.com/2012/07/building-pycrypto-on-amazon-ec2.html Step 1 - Install gcc ...
- 今日头条 SEO 研究,值得深思的 5 个问题
在做SEO的过程中,实际上,我并不是“技术挂”更多的是基于搜索原理与大量的实战,总结相关的经验,这么多年,经常养成一个小习惯,总是记录一些工作中遇到的一些小问题与小技巧. 特别是2017年,12月份开 ...
- [Java]对double变量进行四舍五入,并保留小数点后位数
1.功能 将double类型变量进行四舍五入,并保留小数点后位数 2.代码 import java.math.BigDecimal; import java.math.RoundingMode; im ...