数据结构之散列表实现
1、总结hashcode的一个很好的文章:http://blog.csdn.net/fenglibing/article/details/8905007
http://blog.csdn.net/zhouj634620500/article/details/45034409
2、实现代码:
/*
* 1、利用数组实现的表结构;
* 2、包含几大类变量: 1、 含有元素 2、键、值对 3、该位是否有Object;
* 3、hash散列值得求取;利用hashCode 1如果a.equals(b)那么a.hashCode == b.hashCode();2如果hashCode()在同一个对象上被调用两次,它应该返回的是同一个值,这表明这个对象没有被修改过。
*/
public class MyTable {
private int manyItem;
private Object[] keys;
private Object[] values;
private boolean[] hasItem;
public MyTable(int cap) {
keys = new Object[cap];
values = new Object[cap];
hasItem = new boolean[cap];
}
private int hash(Object key) {
return Math.abs(key.hashCode()) % values.length; // hashCode是object的方法,返回的是一个int类型;abs是求一个数的绝对值;
}
private int nextIndex(int i) { // i是key和value在数组中的位置;
if (i + 1 == values.length) {
return 0;
} else {
return i + 1;
}
}
private int findIndex(Object key) {
int count = 0;
int i = hash(key);
while ((count < values.length) && hasItem[i]) { //还要判断是i对应的数组是否含有元素
if (keys[i].equals(key)) {
return i;
} else {
count++;
i = nextIndex(i);
}
}
return -1;
}
private Object get(Object key) {
int index = findIndex(key);
if (index == -1)
return null;
return values[index];
}
private void put(Object key, Object value) { //插入key和value
int i = findIndex(key);
if (i != -1) {
values[i] = value;
} else if (manyItem < values.length) {
i = hash(key);
while (keys[i] != null) {
i = nextIndex(i); // 找散列值;
}
keys[i] = key;
values[i] = value;
hasItem[i] = true;
manyItem++;
} else
throw new IllegalStateException("table is full!");
}
private void remove(Object key) { //根据key删除value
int i = findIndex(key);
if (i != -1) {
values[i] = null;
keys[i] = null;
manyItem--;
}
throw new IllegalStateException("there is no value!"); //父类:IllegalComponentStateException 在不合理或不正确时间内唤醒一方法时出现的异常信息。换句话说,即 Java 环境或 Java 应用不满足请求操作。
}
private boolean isEmpty() {
return manyItem == 0;
}
private boolean contains(Object key) {
return findIndex(key) != -1;
}
private boolean hasItem(int index){
return hasItem(index);
}
private int size(){
return manyItem;
}
public void clear() {
if (manyItem != 0) {
for (int i = 0; i < values.length; i++) {
keys[i] = null;
values[i] = null;
hasItem[i] = false;
}
manyItem = 0;
}
}
public static void main(String[] args) {
MyTable table = new MyTable(3);
table.put(1, "China");
table.put(2, "American");
table.put(3, "Janpan");
System.out.println(table.get(1).toString());
System.out.println(table.get(2).toString());
System.out.println(table.get(3).toString());
table.clear();
System.out.println(table.size());
}
转载于:https://www.cnblogs.com/neversayno/p/5118778.html
数据结构之散列表实现相关推荐
- 数据结构之散列表(七)
前言 一.什么是散列表 散列表是如何组织数据的呢? 散列表的基本概念 二.Hash算法的设计 什么是Hash算法 Hash算法的应用场景 三.散列表冲突的解决 1. 开放寻址法 2. 链表法 3. 开 ...
- 数据结构四——散列表(上)
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1散列表的由来 从数组随机访问特性说起. 数组的随机访问特性是:数组a,a[5]可以直接访问到数组的第6 ...
- 数据结构四——散列表(下)
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 7 散列表+链表的应用 很多情况下散列表会和链表一起使用.散列表可以通过key查找value.链表可以按 ...
- 利用开放定址法实现散列表的创建、插入、删除、查找操作_快速入门数据结构:散列表(上)...
散列表与散列算法 散列表的英文叫"Hash Table",我们平时也叫它"哈希表"或者"Hash 表",散列表用的是数组支持按照下标随机访问 ...
- 数据结构(55) 散列表(哈希表,hash table,hash map)
目录 1.散列表的基本概念 2.散列函数的构造方法 3.常用的散列函数 3.1.直接定址法 3.2.除留余数法 3.3.数字分析法 3.4.平方取中法 3.5.乘法哈希法(The Multiplica ...
- 【数据结构】散列表知识点
散列存储的特性 散列存储:散列表,采用的存储方式是散列存储.那么何为散列存储呢?散列存储是根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储.采用散列存储的方式存储数据时,具备的优点 ...
- 大话数据结构:散列表
基础介绍 是一种存储结构,就是构建一个函数,以输入的关键字作为自变量,以地址作为因变量.具体实现有很多变种. 代码 #include "stdio.h" #include &quo ...
- 查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)
散列表 散列表的插入.删除.查找操作的时间复杂度可以做到常量级的 O(1),非常高效. 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入.删除.查找操作时间复杂度 ...
- Python与数据结构[4] - 散列表[1] - 分离链接法的 Python 实现
分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...
- c++数据结构:散列表(哈希)
记录的存储位置与关键字之间存在对应关系,对应关系---hash函数 Loc(i)=H(keyi) 假设散列函数为H(key)=k 数据为:1 2 5 8 9 6 7 访问的话可以通过下标来访问数据. ...
最新文章
- 批量 材质 调整_SMT打样小批量加工中的助焊剂是什么
- php安装redis扩展模块
- Linux boot启动串口出现乱码,使用 am335x-evm-sdk-src-02.00.01.07 的源码,UBOOT阶段使用LCD控制器后,内核启动串口控制台输出乱码。...
- Centos 7 搭建nginx 服务 使得别人能够访问自己的个人网站
- 钽电容极性 钽电容极性判断图解
- [译]使用Webpack提高Vue.js应用程序的4种方式
- 中芯国际最终超额募资523.2亿元,14nm工艺打“鸡血”了
- AI 删库,程序员背锅?
- 【opencv+C++】在图像中找四边形
- java date 格式化 yyyymmdd_如何将LocalDate格式化为yyyyMMDD(不含JodaTime)
- 2021年道路运输企业安全生产管理人员考试试卷及道路运输企业安全生产管理人员模拟试题
- Photoshop平面设计:网页设计之论摹仿和抄袭——xiame.com
- 乐高创意机器人moc_深度乐高 篇一:大神带你玩转乐高 Speed 系列套内 MOC
- js初级动态随机抽人事件运用 计时器和超时期应用 解决用on事件onclick多次点击不能停止的问题
- 一个游戏程序员的学习资料(全是好书)
- 如何将PDF转成PPT?为什么转换后不能编辑
- 浅谈量子纠缠,易经,能量,世界(一)
- 来看看你的时间都去哪儿了
- LeetCode 09:回文数(Java实现)
- linux学习——echo -n 和echo -e 参数意义
热门文章
- osg 镜面_浙江天梭手表镜面抛光
- 【2021团体程序设计天梯赛】L2部分(PTA,L2-037到L2-040)题解代码复盘
- UVa12545 - Bits Equalizer
- php如何用菜刀连接getshell,xise菜刀后门箱子制作:Sqlmao连接Mysql实现Getshell
- apache php mysql_PHP环境搭建(php+Apache+mysql)
- python入门--动态绑定属性和方法
- 地址栏 输入 参数 刷新参数丢失_Java 编程技巧:如何实现参数的输入输出?
- 试题11 蒜头君的随机数(排序和去重)
- UnityShader29:模板测试
- Windows系统更新后,VS2012不能使用的问题