Java 散列表的实现
摘自http://www.cxybl.com/html/suanfa/201110125445.html
有改动
public class MyHashtable {
//表中元素个数
private int manyItems; private Object[] keys;
private Object[] data; //若索引i处存在元素,则hasBeenUsed[i]为true,否则为false
private boolean[] hasBeenUsed; //构造函数
public MyHashtable(int capacity){
if(capacity <= 0){
throw new IllegalArgumentException("capacity is negative!");
}
keys = new Object[capacity];
data = new Object[capacity];
hasBeenUsed = new boolean[capacity];
} //hash函数
private int hash(Object key){
return Math.abs(key.hashCode()%data.length);
} //当前索引发生冲突,找下一索引
private int nextIndex(int i){
if(i + 1 == data.length){
return 0;
}else{
return i + 1;
}
} /*
* 如果在表中找到指定的关键字,返回值为关键字的索引,否则返回-1
* 也就是说如果已经存在某个键时,返回的是该键的索引,如果没有这个键,则返回-1
* 在插入新的键时都返回-1
*/
private int findIndex(Object key){
int count = 0;
int i = hash(key);
System.out.println(i);
while((count<data.length)&&hasBeenUsed[i]){
if(key.equals(keys[i])){
return i;
}else{
count++;
i = nextIndex(i);
}
}
return -1; } /*
* 获取某个元素
*/
public Object get(Object key){
int index = findIndex(key);
if(index == -1){
return null;
}
else{
return data[index];
}
} /*
* 放入某个元素
*/
public Object put(Object key,Object element){
int index = findIndex(key);
Object answer; //判断索引是不是-1
if(index != -1){
answer = data[index];
data[index] = element;
return answer;
}else if(manyItems<data.length){
index = hash(key);
while(keys[index] != null){
index = nextIndex(index);
}
keys[index] = key;
data[index] = element;
hasBeenUsed[index] = true;
manyItems++;
return null; }else{
throw new IllegalStateException("Hsahtable is full");
}
} /*
* 删除某个元素
*/
public Object remove(Object key){
int index = findIndex(key);
Object answer = null;
if(index != -1){
answer = data[index];
data[index] = null;
keys[index] = null;
manyItems--;
}
return answer;
} /*
* 是否包含某键
*/
public boolean contains(Object key){
return (findIndex(key)!=-1);
} public static void main(String[] args) {
// TODO Auto-generated method stub
MyHashtable table = new MyHashtable(3); table.put(1, "中国");
Object ob1 = table.put(2, "美国");
table.put(3, "安徽"); System.out.println(table.get(2).toString());
System.out.println(ob1);
} }
Java 散列表的实现的更多相关文章
- Java学习笔记(二十)——Java 散列表_算法内容
[前面的话] 周末,本来打算找人去玩,结果没找到,所以我只好有学习了. 为什么会学习散列表,因为要使用HashMap?因为在做项目的时候,在服务器和客户端需要传输DTO,而传输的属性是动态增加的,所以 ...
- Java 集合 散列表hash table
Java 集合 散列表hash table @author ixenos 摘要:hash table用链表数组实现.解决散列表的冲突:开放地址法 和 链地址法(冲突链表方式) hash table 是 ...
- 散列表(拉链法与线性探测法)Java实现
package practice; import java.security.Principal; import java.util.Scanner; import edu.princeton.cs. ...
- Java数据结构与算法解析(十二)——散列表
散列表概述 散列表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 散列表的思路很简单,如果所有的键都是整数,那么就可以使用一个简单 ...
- 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))
本文根据<大话数据结构>一书,实现了Java版的一个简单的散列表(哈希表). 基本概念 对关键字key,将其值存放在f(key)的存储位置上.由此,在查找时不需比较,只需计算出f(key) ...
- Java数据结构和算法(一)散列表
Java数据结构和算法(一)散列表 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 散列表(Hash table) 也叫哈希表 ...
- 数据结构---散列表查找(哈希表)概述和简单实现(Java)
散列表查找定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的key的对应f(key) ...
- 散列表Java实现
package 散列表; import java.util.Scanner; public class HashSearch { public static int data[] = {69,65,9 ...
- 散列表和JAVA中的hash
引文 hello,今天写的数据结构是散列表(hash表),也算是一种基础数据结构了吧.学过计算机的人大概都能说出来这是个以空间换时间的东西,那么具体怎么实现的是今天要讨论的问题. 为什么需要它?主要还 ...
随机推荐
- css 行内元素 块元素 替换元素 非替换元素 以及这些元素的width height margin padding 特性
一.各种元素的width height margin padding 特性(具体css元素的分来参看二) 1.块级元素 width. height. margin的四个方向. padding的四个方向 ...
- HDFS常见问题
在HDFS里面,data node上的块大小默认是64MB(或者是128MB或256MB) 问题: 为什么64MB(或128MB或256MB)是最优选择? 为什么不能远少于64MB(或128MB或25 ...
- poj 1065 Wooden Sticks 【贪心 新思维】
题目地址:http://poj.org/problem?id=1065 Sample Input 3 5 4 9 5 2 2 1 3 5 1 4 3 2 2 1 1 2 2 3 1 3 2 2 3 1 ...
- codeforces 676B 模拟 递推
题意:每秒从最高处的杯子倒一杯酒下来,酒流的方式如图,问t秒装满酒的杯子的数目. 思路:把第一杯的值设为t,glass[i][j]=(glass[i-1][j-1]-1)/2+(glass[i-1][ ...
- tp导出excel
//数据导出 protected function dao($db,$where,$join,$field){ $data = M($db)->join($join)->where($wh ...
- Java 动态代理机制分析及扩展,第 1 部分
Java 动态代理机制分析及扩展,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/ 本文通过分析 Java 动态代理的机制和特 ...
- linux-常用指令2
命令链接符 ...
- linux命令学习笔记(49):at命令
在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...
- ffmpeg处理rtmp/文件/rtsp的推流和拉流
ffmpeg处理rtmp/文件/rtsp的推流和拉流 本demo演示了利用ffmpeg从服务器拉流或本地文件读取流,更改流url或文件类型名称发送回服务器或存到本地的作用. 由于本程序只写了3个小 ...
- 在Debug中使用断点调试程序
我最近在学习汇编的程序,所以很多都需要动手写点代码去测试,如果是测试三五行代码的还比较简单,可以在debug中直接按T进行单步调试,但是到后来调试的代码越来越复杂,越来越长,如果再使用单步调试不知道要 ...