自己动手系列----使用数组实现一个简单的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中 ...
随机推荐
- 使用 Jest 进行愉快的 JavaScript(TypeScript) 测试
一般我们不管是做前端还是后端,为了提高代码的质量,会选择一种测试驱动开发(TDD)的办法来写代码进行单元测试.Jest 是 Facebook 团队开发的一款测试框架,为的是提高开发者的"开发 ...
- 《C++Primer》第五版习题答案--第六章【学习笔记】
<C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...
- 《自拍教程18》adb_Android设备debug连接工具
adb命令介绍 做Android App测试,Android手机系统测试, 还有很多Android终端产品(手表,车载,智能电视,智能手表等) 都必须用adb命令,通过USB接口,与Android设备 ...
- requests库爬取需要登录的网站
#!usr/bin/env python #-*- coding:utf-8 _*- """ @author:lenovo @file: 登录人人网.py @time: ...
- 使用pem连接服务器
后台同学甩给你一个pem文件,username@IP后如何链接服务器 准备:ssh客户端 例子xshell 文件->新建->主机(连接界面主机输入框输入IP)->点击用户身份-> ...
- VSCode(主进程)
Overview(总览) SETUP(设定) Overview(总览) Linux(略) macOS(略) Windows 使用WSL,您可以在Windows上安装和运行Linux发行版.这使您能够在 ...
- windows 停止和启动Redis
点击win+R 输入cmd 打开cmd窗口 然后输入命令 net stop redis 停止redis net start redis 启动redis
- 2018 IEEE极限编程大赛 题解
去年742,今年72,也算一种小小的进步. 明年前30(笑 1. Drawing Rooted Binary Trees 给定一个树的中序和前序的遍历,要求输出这棵树(包括空格的) #include ...
- JS格式时间
Date.prototype.format = function(format) { var o = { "M+": this.getMonth() + 1, //month &q ...
- jQuery Moblie 问题汇总
1 使用jQuery动态添加html,没有jQuery Moblie的样式 $("body").html(listview);//以上代码只是把结构加上去了,但是却没有加上jqm ...