摘自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 散列表的实现的更多相关文章

  1. Java学习笔记(二十)——Java 散列表_算法内容

    [前面的话] 周末,本来打算找人去玩,结果没找到,所以我只好有学习了. 为什么会学习散列表,因为要使用HashMap?因为在做项目的时候,在服务器和客户端需要传输DTO,而传输的属性是动态增加的,所以 ...

  2. Java 集合 散列表hash table

    Java 集合 散列表hash table @author ixenos 摘要:hash table用链表数组实现.解决散列表的冲突:开放地址法 和 链地址法(冲突链表方式) hash table 是 ...

  3. 散列表(拉链法与线性探测法)Java实现

    package practice; import java.security.Principal; import java.util.Scanner; import edu.princeton.cs. ...

  4. Java数据结构与算法解析(十二)——散列表

    散列表概述 散列表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 散列表的思路很简单,如果所有的键都是整数,那么就可以使用一个简单 ...

  5. 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))

    本文根据<大话数据结构>一书,实现了Java版的一个简单的散列表(哈希表). 基本概念 对关键字key,将其值存放在f(key)的存储位置上.由此,在查找时不需比较,只需计算出f(key) ...

  6. Java数据结构和算法(一)散列表

    Java数据结构和算法(一)散列表 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 散列表(Hash table) 也叫哈希表 ...

  7. 数据结构---散列表查找(哈希表)概述和简单实现(Java)

    散列表查找定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的key的对应f(key) ...

  8. 散列表Java实现

    package 散列表; import java.util.Scanner; public class HashSearch { public static int data[] = {69,65,9 ...

  9. 散列表和JAVA中的hash

    引文 hello,今天写的数据结构是散列表(hash表),也算是一种基础数据结构了吧.学过计算机的人大概都能说出来这是个以空间换时间的东西,那么具体怎么实现的是今天要讨论的问题. 为什么需要它?主要还 ...

随机推荐

  1. China sets economic reform priorities for 2015

    BEIJING -- China's State Council, the cabinet, on Monday unveiled this year's priorities for economi ...

  2. C语言的操作符号

    #include <iostream> int main(void) { int a = 100, b = 40; //理解++在前还后的区别: a = b++; //a = b ; b= ...

  3. 《thinking in java》 接口与内部类

    书本上的例子 改编后的. package test2; class A{ interface B{void f();} public class BImp implements B{public vo ...

  4. ubuntu下搭建Scrapy框架简单办法

    1. 先执行以下命令 sudo apt-get install python-lxml sudo apt-get install libxslt1-dev sudo apt-get install p ...

  5. CSS3特殊图形制作

    CSS3特殊图形制作 现在IE8+的浏览器都支持CSS3+HTML5了,IE8及以下的浏览器的浏览器也快告一段落了,大前端的时代来了.废话不多说,现在开始用CSS3画图 1.心型 //HTML < ...

  6. CSS重置 reset.css

    1. [文件] reset.css ~/*------------------------------------------* site:ifnoif.net* Style author:ifnoi ...

  7. jQuery学习(2)

    <script type="text/javascript"> //给网页中所有的<p>元素添加onclick事件 $("p").cli ...

  8. css 中 div垂直居中的方法

    在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...

  9. C#子线程执行完后通知主线程

    其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿. 那么怎么让子线程去做主线程的事儿呢,我们只需要把主线程的方法传递给子线程就行了,那么传递方法就 ...

  10. linux-常用指令1

    掌握下面的命令是最基本的噢!那是我们使用一个系统最基本的操作. 玩过dos么,其实,linux下的文件操作和dos差不多.没什么难的,多练习就记住了.下面如果有条件的话请跟我一样操作吧!百看不如一做. ...