一、链地址法哈希表代码如下:
package com.tool.wpn.quicksort;
import android.util.Log;
/**
* Created by Xi on 2017/8/16.
* 链地址式哈希表
*/
public class HashTablelink {
private final String TAG="HashTablelink";
private SortedList[] hashArray;
private int arraySize;
public HashTablelink(int size){
arraySize=size;
hashArray=new SortedList[arraySize];
for(int i=0;i<arraySize;i++){
hashArray[i]=new SortedList();
}
}
public void displayTable(){
StringBuilder sb=new StringBuilder();
sb.append("[");
for(int j=0;j<arraySize;j++){
sb.append(hashArray[j].toString());
sb.append(",");
}
sb.append("]");
Log.v(TAG,"HastTableLink的值为:"+sb.toString());
}
/**
* 首次哈希
* 将传入的key经过hash算法,这里使用的普通除以数组大小求余的方法,而实际不是这么简单
* @param key
* @return
*/
public int hashFunc(int key){
return key%arraySize;
}
/**
* 插入元素
*/
public void insert(LinkHash item){
int key=item.getKey();
int hashVal=hashFunc(key);//哈希到的下标位置
hashArray[hashVal].insert(item);
}
/**
* 删除元素
*/
public void delete(int key){
int hashVal=hashFunc(key);//哈希到的下标位置
hashArray[key].delete(key);
}
/**
* 查找元素
*/
public LinkHash find(int key){
int hashVal=hashFunc(key);//哈希到的下标位置
LinkHash theLink=hashArray[hashVal].find(key);
return theLink;
}
}
package com.tool.wpn.quicksort;
import android.util.Log;
/**
* Created by Xi on 2017/8/16.
* 有序链表,链地址式哈希表所用
* 按LindHash 的key 值大小进行有序排序
*/
public class SortedList {
private final String TAG="SortedList";
private LinkHash first;//第一个元素
public SortedList(){
first=null;
}
public void insert(LinkHash theLink){
int key=theLink.getKey();
LinkHash previous=null;
LinkHash current=first;
while(current!=null&&key>current.getKey()){//当前元素不为空,且需添加的元素大于当前元素,继续寻找位置
previous=current;
current=current.next;
}
//找到该放的位置
if(previous==null){//即该链表无元素
first=theLink;
}else{
previous.next=theLink;
theLink.next=current;
}
}
public void delete(int key){
LinkHash previous=null;
LinkHash current=first;
while(current!=null&&key!=current.getKey()){
previous=current;
current=current.next;
}
if(previous==null){//若要删除的元素为第一个
first=first.next;
}else{
previous.next=current.next;
}
}
public LinkHash find(int key){
LinkHash current=first;
while(current!=null&¤t.getKey()<=key){
if(current.getKey()==key){
return current;//找到
}
current=current.next;
}
return null;
}
public void display(){
StringBuilder sb=new StringBuilder();
sb.append("SortedList{");
LinkHash current=first;
while(current!=null){
sb.append(current.getKey());
sb.append(",");
current=current.next;
}
sb.append("}");
Log.v(TAG,sb.toString());
}
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("{");
LinkHash current=first;
while(current!=null){
sb.append(current.getKey());
sb.append(",");
current=current.next;
}
sb.append("}");
return sb.toString();
}
}
package com.tool.wpn.quicksort;
import android.util.Log;
/**
* Created by Xi on 2017/8/16.
* 链地址哈希表中的链表
*/
public class LinkHash {
private int iData;
public LinkHash next;
public LinkHash(int it){
iData=it;
}
public int getKey(){
return iData;
}
public void displayLink(){
Log.v("LinkHash","iData:"+iData);
}
}
二、主函数调用如下:
/**
* 链地址法哈希表
* 即数组中的元素是链表,这样就可以解决哈希冲突问题,因为链表中可以重复放入哈希值相同的元素
*/
private void hashLink(){
int size=20;
HashTablelink hashTable=new HashTablelink(size);
hashTable.insert(new LinkHash(10));
hashTable.insert(new LinkHash(50));
hashTable.insert(new LinkHash(60));
hashTable.insert(new LinkHash(11));
hashTable.insert(new LinkHash(21));
hashTable.insert(new LinkHash(54));
hashTable.insert(new LinkHash(21));
hashTable.displayTable();
LinkHash linkHash = hashTable.find(12);//查找12
if(linkHash==null){
Log.v(TAG,"can't find");
}else{
Log.v(TAG,"find-"+linkHash.getKey());
}
LinkHash item = hashTable.find(11);//查找11
if(item==null){
Log.v(TAG,"can't find");
}else{
Log.v(TAG,"find-"+item.getKey());
}
hashTable.delete(11);//删除11
hashTable.displayTable();
}
日志打印如下:
08-16 11:54:38.742 24193-24193/com.tool.wpn.quicksort V/HashTablelink: HastTableLink的值为:[{60,},{21,},{},{},{},{},{},{},{},{},{10,50,},{11,},{},{},{54,},{},{},{},{},{},]
08-16 11:54:38.742 24193-24193/com.tool.wpn.quicksort V/MainActivity: can't find
08-16 11:54:38.742 24193-24193/com.tool.wpn.quicksort V/MainActivity: find-11
08-16 11:54:38.742 24193-24193/com.tool.wpn.quicksort V/HashTablelink: HastTableLink的值为:[{60,},{21,},{},{},{},{},{},{},{},{},{10,50,},{},{},{},{54,},{},{},{},{},{},]
源码下载地址:点击打开链接