1. 關於java中Hash表用字元串對應數組的做法
這樣輸出
2. 哈希表設計的用Java代碼
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//#include
#define HASH_LEN 50 //哈希表的長度
#define M 47
#define NAME_NO 30 //人名的個數
typedef struct NAME
{
char *py; //名字的拼音
int k; //拼音所對應的整數
}NAME;
NAME NameList[HASH_LEN];
typedef struct hterm //哈希表
{
char *py; //名字的拼音
int k; //拼音所對應的整數
int si; //查找長度
}HASH;
HASH HashList[HASH_LEN];
/*-----------------------姓名(結構體數組)初始化---------------------------------*/
void InitNameList()
{
NameList[0].py="chenghongxiu";
NameList[1].py="yuanhao";
NameList[2].py="yangyang";
NameList[3].py="zhanghen";
NameList[4].py="chenghongxiu";
NameList[5].py="xiaokai";
NameList[6].py="liupeng";
NameList[7].py="shenyonghai";
NameList[8].py="chengquan";
NameList[9].py="luqing";
NameList[10].py="gongyunxiang";
NameList[11].py="sunzhenxing";
NameList[12].py="sunrongfei";
NameList[13].py="sunminglong";
NameList[14].py="zhanghao";
NameList[15].py="tianmiao";
NameList[16].py="yaojianzhong";
NameList[17].py="yaojianqing";
NameList[18].py="yaojianhua";
NameList[19].py="yaohaifeng";
NameList[20].py="chengyanhao";
NameList[21].py="yaoqiufeng";
NameList[22].py="qianpengcheng";
NameList[23].py="yaohaifeng";
NameList[24].py="bianyan";
NameList[25].py="linglei";
NameList[26].py="fuzhonghui";
NameList[27].py="huanhaiyan";
NameList[28].py="liudianqin";
NameList[29].py="wangbinnian";
char *f;
int r,s0;
for (int i=0;i<NAME_NO;i++)
{
s0=0;
f=NameList[i].py;
for (r=0;*(f+r) != NULL;r++) //方法:將字元串的各個字元所對應的ASCII碼相加,所得的整數做為哈希表的關鍵字
s0=*(f+r)+s0;
NameList[i].k=s0;
}
}
/*-----------------------建立哈希表---------------------------------*/
void CreateHashList()
{
for (int i=0; i<NAME_NO; i ++)
{
HashList[i].py="";
HashList[i].k=0;
HashList[i].si=0;
}
for (i=0; i < NAME_NO ; i++)
{
int sum=0;
int adr=(NameList[i].k) % M; //哈希函數
int d=adr;
if(HashList[adr].si==0) //如果不沖突
{
HashList[adr].k=NameList[i].k;
HashList[adr].py=NameList[i].py;
HashList[adr].si=1;
}
else //沖突
{
do{
d=(d+((NameList[i].k))%10+1)%M; //偽散列
sum=sum+1; //查找次數加1
}while (HashList[d].k!=0);
HashList[d].k=NameList[i].k;
HashList[d].py=NameList[i].py;
HashList[d].si=sum+1;
}
}
}
/*-------------------------------------查找------------------------------------*/
void FindList()
{
printf("\n\n請輸入姓名的拼音: "); //輸入姓名
char name[20]={0};
scanf("%s",name);
int s0=0;
for (int r=0;r<20;r++) //求出姓名的拼音所對應的整數(關鍵字)
s0+=name[r];
int sum=1;
int adr=s0 % M; //使用哈希函數
int d=adr;
if(HashList[adr].k==s0) //分3種情況進行判斷
printf("\n姓名:%s 關鍵字:%d 查找長度為: 1",HashList[d].py,s0);
else if (HashList[adr].k==0)
printf("無該記錄!");
else
{
int g=0;
do
{
d=(d+s0%10+1)%M; //偽散列
sum=sum+1;
if (HashList[d].k==0)
{
printf("無記錄! ");
g=1;
}
if (HashList[d].k==s0)
{
printf("\n姓名:%s 關鍵字:%d 查找長度為:%d",HashList[d].py,s0,sum);
g=1;
}
}while(g==0);
}
}
/*--------------------------------顯示哈希表----------------------------*/
void Display()
{
printf("\n\n地址\t關鍵字\t\t搜索長度\tH(key)\t\t拼音 \n"); //顯示的格式
for(int i=0; i<15; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
printf("按任意鍵繼續顯示...\n"); //由於數據比較多,所以分屏顯示(以便在Win9x/DOS下能看到所有的數據)
getchar();
for( i=15; i<30; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
printf("按任意鍵繼續顯示...\n");
getchar();
for( i=30; i<40; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
printf("按任意鍵繼續顯示...\n");
getchar();
for( i=40; i<50; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
float average=0;
for (i=0;i <NAME_NO;i ++)
average+=HashList[i].si;
average/=NAME_NO;
printf("\n\n平均查找長度:ASL(%d)=%f \n\n",NAME_NO,average);
}
/*--------------------------------主函數----------------------------*/
void main()
{
/* ::SetConsoleTitle("哈希表操作"); //Windows API函數,設置控制台窗口的標題
HANDLE hCon = ::GetStdHandle(STD_OUTPUT_HANDLE); //獲得標准輸出設備的句柄
::SetConsoleTextAttribute(hCon, 10|0); //設置文本顏色
*/
printf("\n------------------------哈希表的建立和查找----------------------");
InitNameList();
CreateHashList ();
while(1)
{
printf("\n\n");
printf(" 1. 顯示哈希表\n");
printf(" 2. 查找\n");
printf(" 3. 退出\n");
err:
char ch1=getchar();
if (ch1='1')
Display();
else if (ch1='2')
FindList();
else if (ch1='3')
return;
else
{
printf("\n請輸入正確的選擇!");
goto err;
}
}
}
3. Java的哈希表!
以下為本人勞動成果,供參考(已打包成jar文件).
4. java:哈希表的原理與用法
Hashtable,原理嘛就不知道了。只知道說其是提供了兩個集合之間映射的能力,並且擁有每個元素的查詢時間近乎恆定的特性。兩個集合之間映射的能力,簡單的說,就是像是存放系統屬性的Properties類一樣(該類繼承自Hashtable),Properties類中將String映射到String,你可以用setProperty(String key, String value)把一對值對(key,value)存入Properties中,用getProperty(String key) 取得key對應的value值。用System.getProperties()你可以獲得一個系統屬性的哈希表,直接println出來你就可以看到整個哈希表所構成的集合了。第一個元素應該是java.runtime.name=Java(TM) SE Runtime Environment這個。這里你可以看得出"java.runtime.name"被映射到了"Java(TM) SE Runtime Environment"。在這里你也可以調用System.getProperties().getProperty("java.runtime.name")得到字元串"Java(TM) SE Runtime Environment"。這就是哈希表所提供的功能了,將一個元素映射到另一個元素,這之間的映射所構成的集合就是哈希表了。
你可以自己看看API文檔,裡面有詳細的解說,不過嘛,嘿嘿,中文版的那個翻譯啊,哎,慘不忍睹啊,感觸最多的是——主謂賓都難找啊。
5. java里哈希表作用是什麼
哈西表其實就是一個鍵值對的集合,通常可以往哈西表中存入鍵和值,通過鍵獲取值
6. java 哈希表查找
化為線性表,hash函數,你可以想一想為什麼這么快呢?
因為他利用了所存數據的結構,就拿用hash表存字元串來說,他正是利用了字元串的結構,比如舉個例子,hash(str)=27*27*str[2]+27*str[1]+str[0],通過這個就區分出了abc和acb的不同了
但是hash函數也有缺點,一點點變動對於他的影響都是很大的,首先開辟更大的內存空間和數據不說,還要從新定義hash函數
凡事有利有弊
7. java 用哈希表解決
publicclassTest{
privatestaticMap<Teacher,Student>map;
publicstaticvoidmain(String[]args){
map=newHashMap<Teacher,Student>();
map.put(newTeacher("a_teacher"),newStudent("a_student",11,"boy"));
map.put(newTeacher("b_teacher"),newStudent("b_student",12,"boy"));
map.put(newTeacher("c_teacher"),newStudent("c_student",13,"girl"));
map.put(newTeacher("d_teacher"),newStudent("d_student",14,"girl"));
test("b_teacher");
}
publicstaticvoidtest(StringteacherName){
Teacherteacher=newTeacher(teacherName);
Studentstudent=map.get(teacher);
System.out.println(student);
}
}
classTeacher{
privateStringname;
publicTeacher(Stringname){
super();
this.name=name;
}
publicTeacher(){
super();
}
@Override
publicinthashCode(){
returnthis.name.hashCode();
}
@Override
publicbooleanequals(Objectobj){
if(objinstanceofTeacher){
Teacherother=(Teacher)obj;
if(this.name.equals(other.name)){
returntrue;
}else{
returnfalse;
}
}else{
thrownewRuntimeException("類型轉換錯誤");
}
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
classStudent{
privateStringname;
privateintage;
privateStringsex;
publicStudent(){
super();
}
publicStudent(Stringname,intage,Stringsex){
super();
this.name=name;
this.age=age;
this.sex=sex;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetSex(){
returnsex;
}
publicvoidsetSex(Stringsex){
this.sex=sex;
}
@Override
publicStringtoString(){
return"Student[name="+name+",age="+age+",sex="+sex+"]";
}
}