导航:首页 > 编程语言 > java实现哈希表

java实现哈希表

发布时间:2022-08-09 12:06:46

A. 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+"]";
}

}

B. java中的Hashtable怎么用,请详细举例子说明,拜托了 谢谢

就是哈希表,下面这个示例创建了一个数字的哈希表。它将数字的名称用作键: Hashtable<String, Integer> numbers = new Hashtable<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);
要获取一个数字,可以使用以下代码:
Integer n = numbers.get("two");
if (n != null) {
System.out.println("two = " + n);
}

C. 数据结构(java版)哈希表的设计

1.什么是哈希表?
哈希表是一种数据结构,它提供了快速的插入操作和查找操作。其基于数组来实现。

2.哈希化
1)直接将关键字作为索引。
2)将单词转换成索引。
<1>将字母转换成ASCII码,然后进行相加
<2>幂的连乘
<3>压缩可选值

3.压缩后仍然可能出现的问题。
冲突:不能保证每个单词都映射到数组的空白单元。
解决办法:
<1>开放地址法
<2>链地址法

/**
* 员工信息类
* @author Administrator
*
*/
public class Info {
private String key;
private String name;

public Info(String key, String name) {
this.key = key;
this.name = name;
}

public String getKey() {
return key;
}

public void setKey(String key) {
this.key = key;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

import java.math.BigInteger;

public class HashTable {
private Info[] arr;

/**
* 默认的构造方法
*/
public HashTable() {
arr = new Info[100];
}

/**
* 指定数组初始化大小
*/
public HashTable(int maxSize) {
arr = new Info[maxSize];
}

/**
* 插入数据
*/
public void insert(Info info) {
arr[hashCode(info.getKey())] = info;
}

/**
* 查找数据
*/
public Info find(String key) {
return arr[hashCode(key)];
}

public int hashCode(String key) {
// int hashVal = 0;
// for(int i = key.length() - 1; i >= 0; i--) {
// int letter = key.charAt(i) - 96;
// hashVal += letter;
// }
// return hashVal;

BigInteger hashVal = new BigInteger("0");
BigInteger pow27 = new BigInteger("1");
for(int i = key.length() - 1; i >= 0; i--) {
int letter = key.charAt(i) - 96;
BigInteger letterB = new BigInteger(String.valueOf(letter));
hashVal = hashVal.add(letterB.multiply(pow27));
pow27 = pow27.multiply(new BigInteger(String.valueOf(27)));
}
return hashVal.mod(new BigInteger(String.valueOf(arr.length))).intValue();
}
}

public class TestHashTable {
public static void main(String[] args) {
HashTable ht = new HashTable();
ht.insert(new Info("a","张三"));
ht.insert(new Info("ct","李四"));
ht.insert(new Info("wangwu","王五"));

System.out.println(ht.find("a").getName());
System.out.println(ht.find("ct").getName());
}
}

D. java 如何实现几个类共用一个哈希表

使用哈希表的 MutableAttributeSet 的直接实现

E. JAVA创建一个哈希表储存数据并输出,要完整代码

我就不写了,给个提示吧:
建一个类,名字就叫员工,它有三个属性,分别是你要的三个数据,名字、工龄、工号。然后,每次put的时候这样:put('1234',员工1);以员工工号为key,类员工为value

F. 用java编写哈希表,输入一组数据,创建一个哈希表,然后进行元素的查询、删除

#包括中
#包括中

#包括

/ /#包括

#定义50 HASH_LEN / /哈希表的长度

#定义男47

#定义NAME_NO 30 / /数字名称

typedef结构名称

{

的char * PY; / /名称的字母

K; / /拼音对应的整数

}名称;

名称名单[HASH_LEN];

typedef的struct hterm的/ /哈希表

{,

炭* PY / /名称的字母

K; / /拼音对应的整数

诠释SI / /查找长度

} HASH; BR /> HASH HashList的[HASH_LEN];

/ * -----------------------名称(结构数组)来初始化 - -------------------------------- * /

的无效InitNameList()

{
>名单[0]。 PY =的“chenghongxiu”;

名单[1]。 PY =“元昊”;

名单[2]。 PY =“襄阳”;

名单[3]。 PY =的“zhanghen”;

名单[4]。 PY =的“chenghongxiu”;

名单[5]。 PY =“杨小凯”;的

名单[6]。 PY =“六朋”;

名单[7]。 PY =的“shenyonghai”;

名单[8]。 PY =“chengquan”名单[9]。 PY =的“luqing”;

名单[10]。 PY =的“gongyunxiang”;

名单[11]。 PY =的“sunzhenxing”;

名单[12]。 PY =的“sunrongfei”;

名单[13]。 PY =的“sunminglong”;

名单[14]。 PY =“张皓”;

名单[15]。 PY =“田苗”;

名单[16]。 PY =的“yaojianzhong”;

名单[17]。 PY =的“yaojianqing”;

名单[18]。 PY =的“yaojianhua”;

名单[19]。 PY =的“yaohaifeng”;

名单[20]。 PY =的“chengyanhao”;

名单[21]。 PY =的“yaoqiufeng”;

名单[22]。 PY =的“qianpengcheng”;

名单[23]。 PY =的“yaohaifeng”;

名单[24]。 PY =的“bianyan”;

名单[25]。 PY =“linglei”;

名单[26]。 PY =的“fuzhonghui”;

名单[27]。 PY =的“huanhaiyan”;

名单[28]。 PY =的“liudianqin”;

名单[29]。 PY =的“wangbinnian”

字符* F;

INT R,S0;

(INT I = 0; <NAME_NO; + +)

{

S0 = 0;

F =名单[I]。 PY

相关(r = 0; *(F + R)= NULL与r + +)/ /方法:每个字符的字符串对应的ASCII码的总和,所得到的整数作为哈希表的关键字

S0 =(F + R)+ S0;

名单[I]。 K = S0;

}

}

/ * -----------------------建立哈希表--------------------------------- * /

的无效CreateHashList()

{(INT I = 0; <NAME_NO; + +)

{

HashList [I]。 PY =“”;

HashList [I]。 K = 0;

HashList [I]。 SI = 0;

}

(I = 0; <NAME_NO + +)

{

总和= 0;

ADR =(名单[I] K)%M / /哈希函数

- = ADR;

(HashList [ADR] SI == 0)/ /如果没有冲突

{ HashList [ADR]。 K =的名单[I]。 K;,

HashList [ADR]。 PY =的名单[I]。 PY;,

HashList [ADR]。 SI = 1;

} 其他/ /冲突

{

{

D =(D +((名单[I] K))%10 + 1)%M / /伪哈希总和=总和+1 / /发现号加1

}(HashList [D] K!= 0);

BR /> HashList的研究[D]。 K =的名单[I]。 K;

HashList的研究[D]。 PY =的名单[I]。 PY;

HashList的研究[D]。 SI =总和+1;

}

}

}

/ * ------------------- ------------------查找------------------------------- ----- * /

的无效FindList()

{

的printf(“\ n \ n已请输入名字的拼音:”); / /输入名称
>字符名[20] = {0};

scanf函数(“%”,名称)

INT S0 = 0;

(R = 0; <20,R + +)/ /找到对应的字母的名称一个整数(关键字)

S0 + =名称[R]。

总和= 1; BR /> ADR = S0%M,/ /使用哈希函数

= ADR;

如果判断(HashList [ADR]。K == S0)/ /三例

的printf(“\ N名:%s关键字:%d个查找长度:1”,HashList [J]。PY,S0);

否则,如果(HashList [ADR]。K == 0)

的printf(“有没有这样的记录!”); 其他

{

G = 0;

{

D =(D + S0%10 +1)%M; / /伪散货的列

总和=总和+1;

(HashList的研究[D]。K == 0)

{

的printf(“无记录!”); <br / G = 1;

}

(HashList并[d],K = S0)

{
>的printf(“\ N名:%s关键字:%d个查找长度为:%d的”HashList [J]。PY,S0,总和);

G = 1;

}
>},(G == 0);

}

}

/ * -------------------- ------------展览哈萨克斯坦希腊表---------------------------- * /

无效显示()

{

的printf(“\ n \ n已地址\吨关键字\ T \ T查找长度\ TH(键)\ T \吨拼音\ N”); / /显示格式 BR p>(INT I = 0; <15; + +)

{

的printf(“%d的”,I);

的printf(“\吨%D“HashList [I] K);

的printf(”\ T \ T%D“,HashList [I] SI);

的printf(”\ T \ T%D“ (HashList [I] K)%M);

的printf(“\%”,HashList的[]。PY);

的printf(“\ N”);

}

的printf(“按任意键继续显示... \ N”); / /由于数据较多,所以分屏显示(Win9x/DOS仍然可以看到所有的数据)

用getchar();

(I = 15; <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(”\%“,HashList的[I]。PY);

的printf(”\ N“)

}

的printf(“按任意键继续呈现... \ N”);

的getchar的();

(I = 30; I <40 +)

{

的printf(“%d的”,我);

的printf(“\吨为%d”,HashList [I],K); />的printf(“\ T \ T%D”,HashList [I] SI);

的printf(“\ T \ T%D”(HashList [I] K)%M); />的printf(“\%”,HashList [I] PY);

的printf(“\”);

}

的printf(“按任意键继续呈现... \ N“);

的getchar的();

(I = 40; <50; + +)

{

的printf(”为%d“,I);

的printf(”\吨为%d“,HashList [I] K)

的printf(”\ T \ T%D“,HashList [I] SI) ;

的printf(“\吨\ T为%d”,(HashList [I],K)%M);

的printf(“\%”,HashList的[]。PY); BR />的printf(“\ N”);

}

浮法平均= 0;

(= 0; <NAME_NO; + +)<BR /平均+ = HashList [I]。 SI;

/ = NAME_NO;

的printf(“\ N \ N平均查找长度:ASL(%D)=%f \ N \ N”,NAME_NO平均);

}

/ * --------------------------------主要功能------ ---------------------- * /

无效的主要()

{

/ * :: SetConsoleTitle(“哈希表操作“)/ / Windows API函数,设置控制台窗口标题

手柄HCON = :: GetStdHandle(STD_OUTPUT_HANDLE); / /得到标准输出设备处理

:: SetConsoleTextAttribute(HCON,10 | 0 )/ /设置文本颜色

* /

的printf(“\ N ------------------------哈希表的创建查找----------------------“);

InitNameList();

CreateHashList();

>(1)

{

的printf(“\ N \ N”);

的printf(“1。显示哈希表\”);

printf(“请2查找\ N“);

的printf(”3。退出\ n“);

错误:

字符CH1 =的getchar的();

(CH1 = '1')

显示();

其他(CH1 = '2')

FindList();

其他(CH1 = '3')返回;

其他

{

的printf(“\ n请输入正确的选择!”);

转到犯错;

}
} }

G. 哈希表设计的用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;
}
}
}

H. Java中Map如何实现<String,泛型>的哈希表呢

public static <T> Map<String, T> method(Map<String, T> paramsMap){
}

I. Java的哈希表!

以下为本人劳动成果,供参考(已打包成jar文件).



J. JAVA中用哈希表怎么进行排序

Hashtable类

Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。

添加数据使用put(key,
value),取出数据使用get(key),这两个基本操作的时间开销为常数。

Hashtable通过initial capacity和load
factor两个参数调整性能。通常缺省的load factor
0.75较好地实现了时间和空间的均衡。增大load
factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。

使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:

Hashtable numbers = new
Hashtable();
numbers.put(“one”,
new Integer(1));

numbers.put(“two”, new
Integer(2));
numbers.put(“three”,
new Integer(3));

要取出一个数,比如2,用相应的key:
Integer
n = (Integer)numbers.get(“two”);

System.out.println(“two = ”
+ n);

由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。

如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。

Hashtable是同步的

阅读全文

与java实现哈希表相关的资料

热点内容
vim命令复制 浏览:813
单片机中有pt0吗 浏览:319
程序员科研知乎 浏览:65
图图老师讲数学美国算法 浏览:623
三星s9安全文件夹有啥用 浏览:722
怎么ai捏脸安卓 浏览:278
军命令证书 浏览:534
误删苹果app怎么恢复 浏览:868
如何设置内网服务器IP 浏览:76
马老师的加密通话视频 浏览:745
扫码识价app哪里可以买 浏览:553
wpstopdf转换器 浏览:641
怎么把pdf导入iphone 浏览:567
7z后缀文件解压缩 浏览:906
服务器为什么禁用三叉戟 浏览:936
解压小视频卸妆或化妆 浏览:557
太监程序员 浏览:59
java编译选项包括 浏览:435
安卓手机如何导其他手机的通讯录 浏览:931
离心式压缩机品牌 浏览:169