自己动手系列----使用数组实现一个简单的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中 ...
随机推荐
- node模块化开发基本知识学习笔记
传统非模块化开发缺点: 1.命名冲突 2.文件依赖 标准的模块化规范: 1.AMD-requirejs 2.CMD-seajs 服务器端模块化规范: 1.CommonJS-Node.js 模块化相关的 ...
- 关于Synchronized研伸扩展
代码1 synchronized方法 synchronized void method(){ .......... } 代码2 synchronized代码块 synchronized (obj){ ...
- Centos7 虚拟机安装增强功能
1 yum update kernel -y yum install kernel-headers kernel-devel gcc make -y init 6 2 菜单栏--设备--安装增强工具 ...
- Missing artifact com.oracle:ojdbc14:jar:10.2.0.1.0
问题说明:导入Maven项目时,想要添加Oracle驱动包时,Maven的pom.xml总是报Missing artifact com.oracle:ojdbc14:jar:10.2.0.1.0错. ...
- 【database】复制表数据到相同备份表
目的及由来,因为数据库表都采取逻辑删除isDeleted=true/flase,但是之前有些报表或者其他的sql并没有在sql中指明此条件.为了不影响之前代码,所以: 1.数据库中创建一张相同的表,把 ...
- 76.0.3809.100版本的谷歌浏览器对应能用的chromedriver版本
# -*- coding: utf-8 -*- # @Time : 2019/9/3 11:42 # @Author : wujf # @Email : 1028540310@qq.com # @Fi ...
- matplotlib调整子图大小
因为子图太多而导致每个子图很小,很密,如何调整
- 0级搭建类014-Red Hat Enterprise Linux 7.6 安装
RHEL 7.6 操作系统安装 这个很简单的嘛?有什么好讲的?
- asp.net core 自定义基于 HttpContext 的 Serilog Enricher
asp.net core 自定义基于 HttpContext 的 Serilog Enricher Intro 通过 HttpContext 我们可以拿到很多有用的信息,比如 Path/QuerySt ...
- itchat 爬了爬自己的微信通讯录
参考 一件有趣的事: 爬了爬自己的微信朋友 忘记从谁那里看到的了,俺也来试试 首先在annconda prompt里面安装了itchat包 pip install itchat 目前对python这里 ...