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是同步的