package com.wpr.collection;

import java.util.LinkedList;
import java.util.List; public class HashTable<AnyType> { private static final int DEFAULT_TABLE_SIZE = 101; private List<AnyType>[] theList;
private int curSize; public HashTable() {
this(DEFAULT_TABLE_SIZE);
} public HashTable(int size) {
//构造一个质数长度的链表
this.theList = new LinkedList[nextPrime(size)];
for(int i=0;i<theList.length;i++){
theList[i]= new LinkedList<>();
}
}
/**
* 插入,如果元素已经存在,直接返回
* @param x
*/
public void insert(AnyType x){
List<AnyType> temp = theList[myHast(x)];
if(!temp.contains(x)){
temp.add(x);
if(++curSize>theList.length)
reHash();
}
}
/**
* 表的size太小,数据的长度和表长相等时重新调整表长,装填因子为1
*/
private void reHash() {
List<AnyType>[] old = theList;
theList = new LinkedList[theList.length*2];
//更新hashTable
for(int i=0;i<theList.length;i++)
theList[i]=new LinkedList<>();
curSize = 0; for(int i=0;i<old.length;i++){
for(AnyType x:old[i])
insert(x);
}
} public void clear(){
for(List l:theList){
l.clear();
}
}
public void remove(AnyType x){
List<AnyType> temp = theList[myHast(x)];
if(temp.contains(x)){
temp.remove(x);
curSize--;
}
}
public boolean contain(AnyType x){
List<AnyType> temp = theList[myHast(x)];
return temp.contains(x);
}
/**
* 计算数据的hash值
* @param x
* @return
*/
private int myHast(AnyType x) {
int hashValue = x.hashCode(); hashValue%=theList.length;
if(hashValue<0)
hashValue+=theList.length;
return hashValue;
} /**
* 返回一个比size大的质数
* @param size
* @return
*/
private int nextPrime(int size) {
if(size%2==0)
size++;
while(!isPrime(size)){
size +=2;
}
return 0;
}
/**
* 判断size是否为质数
* @param size
* @return
*/
private boolean isPrime(int size) {
if(size%2==0||size==1)
return false;
if(size==2 || size==3)
return true;
for(int i=3;i<Math.sqrt(size);i+=2){
if(size%i==0)
return false;
}
return true;
}
}

最新文章

  1. android retrofit @Query用法
  2. 每天一个linux命令(42):crontab命令
  3. Apache无法访问 Forbidden
  4. Firefox Security Toolkit 安装
  5. 用frame实现最基本的上中下三层布局,中间又分左右两部分.
  6. xv6中存储cpu和进程信息的技巧
  7. Flex组件的生命周期
  8. IOS百度地图之---&gt;第一篇《环境配置与基本使用》
  9. linux下64位汇编的系统调用(4)
  10. Cannot execute request on any known server或DiscoveryClient_UNKNOWN/DESKTOP-MQ8D0C9:8761
  11. 网络远程唤醒 WOL Magic Packet
  12. 51Nod1309 Value of all Permutations 期望
  13. 回忆Partition算法及利用Partition进行快排
  14. PAT L2-022 重排链表
  15. SQL注入之Sqli-labs系列第八篇(基于布尔盲注的注入)
  16. Error when clicking other button after displaying Popup window(转)
  17. apache airflow docker 运行简单试用
  18. Phonegap 工程项目介绍
  19. luoguP3239 [HNOI2015]亚瑟王 概率期望DP
  20. apply函数应用

热门文章

  1. jQuery.validate API
  2. Shell 的source命令
  3. dos 实用命令收集
  4. php 采用fpdf乱码问题
  5. db file sequential read (数据文件顺序读取)
  6. Java多线程的五种状态
  7. Java中的路径问题
  8. http-equiv
  9. ubuntu ip
  10. BIOS启动项中的设备都有哪些