小弟刚刚学习C语言做了个哈希的统计同学他们班要java的谁能帮忙把我的改成java的? 能帮忙的留下邮箱我会把文件发到邮箱 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 java 自带hash 去网上找个hashset 或者hashmap的例子看看 呵呵,也不见楼主给个C的实现。。而且楼上也说了, java.util包里面本身就有hash类,如果你们学习用到的话,只用改改语法就应该可以了 我是用C不过我同学他们要用java,他要我帮忙,可是我没学过,所以发上来求大家帮忙下 楼主叫你朋友看看hashmap这些类吧,自己能做的事情自己做 #include <iostream.h>#include <string>#include <iomanip.h>using namespace std; const int TOTAL=39; //39个关键字const int MAXLEN=10; //关键字长度const int HASHLEN=41; //哈希表长度int cont=0; //统计哈希表中的关键字个数void jiemian();void Show(int key);void Select(int choice);int Read(char *filename);int Input(); int isLetter(char ch);int isKeyWords(char *word);int FindHX(char *keyword);int CreatHX(char *keyword);int GetFreePos(int key);void ResetHX();int GetKey(char *keyword);char KeyWords[TOTAL][MAXLEN]= //构造二维数组存储39个关键字{ "asm","auto","break","case","cdecl", "char","const","continue","default","do", "double","else","enum","extern","far", "float","for","goto","huge","if", "int","interrupt","long","near","pascal", "register","return","short","signed","sizeof", "static","struct","switch","typedef","union", "unsigned","void","volatile","while", };class HASH //哈希表类{public: char keyword[MAXLEN]; int count; //出现次数(频度) int con; //冲突次数}; HASH HS[HASHLEN]; void main(){ ResetHX(); //先清空哈希表 cout<<"\t================================================================="<<endl; cout<<"\t* 欢迎使用该软件,请按提示操作 *"<<endl; cout<<"\t* 该程序功能是统计一个文件中C语言关键字的频度 *"<<endl; cout<<"\t* 统计开始前请先读取一个文件 *"<<endl; cout<<"\t* *"<<endl; cout<<"\t* *"<<endl; cout<<"\t================================================================="<<endl<<endl; jiemian(); Select(Input());} void jiemian(){ cout<<endl; cout<<"\t\t1.读取一个文件"<<endl; cout<<"\t\t2.输出Hash表(关键字总数,冲突次数)"<<endl; cout<<"\t\t3.查询某关键字在Hash表中的情况"<<endl; cout<<"\t\t4.显示Hash表中的冲突关键字"<<endl; cout<<"\t\t5.显示C语言关键字的Hash函数值(作为对照)"<<endl; cout<<"\t\t6.回主菜单"<<endl; cout<<"\t\t7.退出"<<endl;}int Input(){ cout<<endl; cout<<"按'6'回主菜单,请输入你的选择(1-7): "; while(true) //确保输入的为数字 { int choice=0; if((cin>>choice)) { if((choice<=0)||(choice>7)) cout<<"输入范围不正确,请重新输入"<<endl; } else { cout<<"输入错误,请重新输入"<<endl; cin.clear(); } while(!isspace(cin.get())) //功能:判断字符是否为空白符 //说明:当字符为空白符时,返回非零值,否则返回零。 // 空白符指空格、水平制表、垂直制表、换页、回车和换行符。 continue; cout<<endl; return choice; }}void Show(int key){ if(key<0||key>=HASHLEN) { cout<<"关键字不存在!"<<endl; return; } if(strlen(HS[key].keyword)==0) { cout<<"哈希表位置:"<<key<<" 记录是空的"<<endl; return ; } cout<<"哈希表位置: "<<key<<" 关键字: " <<HS[key].keyword<<" 出现次数 "<<HS[key].count<<endl; cont++;}void Select(int choice){ char filename[128],word[MAXLEN]; int i,key,count; switch(choice) { case 1: cout<<"请输入要读取的文件名(文件必须与程序在同一目录下):"; cin>>filename; cout<<endl; Read(filename); Select(Input()); break; case 2: cout<<"每次显示5行,请按回车键继续!"<<endl<<endl; for(i=0;i<HASHLEN;i++) { Show(i); if((i+1)%5==0) getchar(); //为了清晰,每次显示5行 } cout<<"关键字总数为:"<<cont<<endl; Select(Input()); break; case 3: cout<<"请输入你想要查找的关键字: "; cin>>word; cout<<endl; Show(FindHX(word)); Select(Input()); break; case 4: cout<<"\t冲突关键字列表"<<endl<<endl; count=0; for(i=0;i<HASHLEN;i++) { if(strlen(HS[i].keyword)>0) { key=GetKey(HS[i].keyword); if(key!=i) { count++; cout<<"\t[关键字]: "<<HS[i].keyword<<endl; cout<<"\t[哈希表当前位置]: "<<i<<endl; cout<<"\t[冲突次数]: "<<HS[i].con<<endl<<endl; } } } if(count==0) cout<<"没有冲突"<<endl; else cout<<"\t冲突关键字共:"<<count<<"个"<<endl; Select(Input()); break; case 5: cout<<" C语言中的关键字和其在哈希表的位置:"<<endl; for(i=0;i<TOTAL;i++) { cout<<setiosflags(ios::left)<<"["<<setw(2)<<GetKey(KeyWords[i])<<"]" <<setiosflags(ios::left)<<setw(11)<<KeyWords[i]; if((i+1)%5==0) cout<<endl; } cout<<endl; Select(Input()); break; case 6: jiemian(); Select(Input()); case 7: break;//退出 default: Select(Input()); return; }}int Read(char *filename) //读取文件{ char word[MAXLEN],ch; int i; FILE *read; if( (read=fopen(filename,"r"))==NULL ) //只读方式打开一个文本文件,只允许读数据 { cout<<"文件不存在,请确认好再输入!"<<endl; return -1; } ResetHX(); //读取文件前先清空哈希表 while(!feof(read)) //feof()是文件结束检测函数,如果没有结束,返回值是0,结束了是1 { i=0; ch=fgetc(read); //读取一个字符 while(isLetter(ch)==0 && feof(read)==0 ) ch=fgetc(read); //如果不是字母的话接着读取 while(isLetter(ch)==1 && feof(read)==0 ) { if(i==MAXLEN) { while(isLetter(ch)==1&& feof(read)==0) { ch=fgetc(read); } i=0; break; } //超过关键字长度将跳过当前识别区域,读取后一单词 else { //将连续读取的字母存在数组里,组成一个单词 word[i++]=ch; ch=fgetc(read); } } word[i]='\0'; //字符数组的结束标志 if(isKeyWords(word)) { CreatHX(word); } } fclose(read); cout<<"读取成功,文件中关键字已经存入hash表,请继续操作"<<endl; jiemian(); return 1;}int isLetter(char ch) //判断是否是字母,因为关键字都是英文单词{ if( (ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z') ) return 1; else return 0; //是字母就返回1,否则返回0值} int FindHX(char *keyword) //查找哈希表,分块查找{ int key,find,tem=0; if(!isKeyWords(keyword)) return -1; key=GetKey(keyword); if(strcmp(HS[key].keyword,keyword)==0) return key; for(find=key+1;find<HASHLEN;find++) { //线性探查法顺序查找哈希表中是否已存在关键字 tem++; //统计冲突次数 if(strcmp(HS[find].keyword,keyword)==0){ HS[find].con=tem; return find; } } for(find=0;find<key;find++) { tem++; if(strcmp(HS[find].keyword,keyword)==0){ HS[find].con=tem; return find; } } return -1;} int CreatHX(char *keyword) //建立哈希表{ int key; if(!isKeyWords(keyword)) return -1; key=GetKey(keyword); //计算哈希值 if(strlen(HS[key].keyword)>0) //判断关键字表中该位置是否存在关键字 { //已经存在有关键字 if(strcmp(HS[key].keyword,keyword)==0) { //再判断哈希表中该位置的关键字是否相同 HS[key].count++; return 1; } key=FindHX(keyword); //不相同,继续查找 if(key<0) { key=GetFreePos(GetKey(keyword)); if(key<0) return -1; strcpy(HS[key].keyword,keyword); //将关键字插入哈希表 } if(key<0) return -1; HS[key].count++; } else //该位置为空,直接将关键字插入该位置中 { strcpy(HS[key].keyword,keyword); HS[key].count++; } return 1;}int GetFreePos(int key) //在哈希表中给关键字找个位置插进去{ int find,tem=0; if(key<0||key>=HASHLEN) return -1; for(find=key+1;find<HASHLEN;find++) //先找后面的位置 { tem++; if(strlen(HS[find].keyword)==0){ HS[find].con=tem; return find; } } for(find=0;find<key;find++) //再找前面的位置 { tem++; if(strlen(HS[find].keyword)==0){ HS[find].con=tem; return find; } } return -1; //哈希表已满}void ResetHX() //重置哈希表,{ int i; for(i=0;i<HASHLEN;i++) { strcpy(HS[i].keyword,""); //不能用等号赋值 HS[i].count=0; HS[i].con=0; }} int GetKey(char *keyword) //哈西函数{ //Hash函数为:Hash(Key)=[(Key的首字母序号)*100+(Key的尾字母序号)] Mod 41 return ( keyword[0]*100+keyword[strlen(keyword)-1] ) % 41; //这里不要忘了减1} int isKeyWords(char *word) //判断是否关键字{ int i; for(i=0;i<TOTAL;i++) if(strcmp(word,KeyWords[i])==0) return 1; return 0;} 不知道楼主为什么用文件输入?把那39个关键字直接放入到你自己的Hash表中不就可以了吗?你的Hash表只有41的长度啊。 java 用键盘选择按钮 关于SocketChannel.write的一些问题 急JAVA 问一个问题 请求java题解,我是菜鸟 ObjectInputStream传输对象的问题 关于jar打包的问题 求eclipse3.0下载地址 JBuilder中,如何创建一个没有标题栏(title)的对话框? java中怎样判断中文字符 求解 实例变量与类变量 关于null的问题
去网上找个hashset 或者hashmap的例子看看
而且楼上也说了, java.util包里面本身就有hash类,如果你们学习用到的话,只用改改语法就应该可以了
不过我同学他们要用java,他要我帮忙,可是我没学过,所以发上来求大家帮忙下
#include <string>
#include <iomanip.h>
using namespace std; const int TOTAL=39; //39个关键字
const int MAXLEN=10; //关键字长度
const int HASHLEN=41; //哈希表长度int cont=0; //统计哈希表中的关键字个数
void jiemian();
void Show(int key);
void Select(int choice);
int Read(char *filename);
int Input();
int isLetter(char ch);
int isKeyWords(char *word);
int FindHX(char *keyword);
int CreatHX(char *keyword);
int GetFreePos(int key);
void ResetHX();
int GetKey(char *keyword);char KeyWords[TOTAL][MAXLEN]= //构造二维数组存储39个关键字
{
"asm","auto","break","case","cdecl",
"char","const","continue","default","do",
"double","else","enum","extern","far",
"float","for","goto","huge","if",
"int","interrupt","long","near","pascal",
"register","return","short","signed","sizeof",
"static","struct","switch","typedef","union",
"unsigned","void","volatile","while",
};class HASH //哈希表类
{
public:
char keyword[MAXLEN];
int count; //出现次数(频度)
int con; //冲突次数
};
HASH HS[HASHLEN];
void main()
{
ResetHX(); //先清空哈希表
cout<<"\t================================================================="<<endl;
cout<<"\t* 欢迎使用该软件,请按提示操作 *"<<endl;
cout<<"\t* 该程序功能是统计一个文件中C语言关键字的频度 *"<<endl;
cout<<"\t* 统计开始前请先读取一个文件 *"<<endl;
cout<<"\t* *"<<endl;
cout<<"\t* *"<<endl;
cout<<"\t================================================================="<<endl<<endl;
jiemian();
Select(Input());
}
void jiemian()
{
cout<<endl;
cout<<"\t\t1.读取一个文件"<<endl;
cout<<"\t\t2.输出Hash表(关键字总数,冲突次数)"<<endl;
cout<<"\t\t3.查询某关键字在Hash表中的情况"<<endl;
cout<<"\t\t4.显示Hash表中的冲突关键字"<<endl;
cout<<"\t\t5.显示C语言关键字的Hash函数值(作为对照)"<<endl;
cout<<"\t\t6.回主菜单"<<endl;
cout<<"\t\t7.退出"<<endl;
}int Input()
{
cout<<endl;
cout<<"按'6'回主菜单,请输入你的选择(1-7): ";
while(true) //确保输入的为数字
{
int choice=0;
if((cin>>choice))
{
if((choice<=0)||(choice>7))
cout<<"输入范围不正确,请重新输入"<<endl;
}
else
{
cout<<"输入错误,请重新输入"<<endl;
cin.clear();
}
while(!isspace(cin.get())) //功能:判断字符是否为空白符
//说明:当字符为空白符时,返回非零值,否则返回零。
// 空白符指空格、水平制表、垂直制表、换页、回车和换行符。
continue;
cout<<endl;
return choice;
}
}void Show(int key)
{
if(key<0||key>=HASHLEN)
{
cout<<"关键字不存在!"<<endl;
return;
}
if(strlen(HS[key].keyword)==0)
{
cout<<"哈希表位置:"<<key<<" 记录是空的"<<endl;
return ;
}
cout<<"哈希表位置: "<<key<<" 关键字: "
<<HS[key].keyword<<" 出现次数 "<<HS[key].count<<endl;
cont++;
}void Select(int choice)
{
char filename[128],word[MAXLEN];
int i,key,count;
switch(choice)
{
case 1:
cout<<"请输入要读取的文件名(文件必须与程序在同一目录下):";
cin>>filename;
cout<<endl;
Read(filename);
Select(Input());
break; case 2:
cout<<"每次显示5行,请按回车键继续!"<<endl<<endl;
for(i=0;i<HASHLEN;i++)
{
Show(i);
if((i+1)%5==0) getchar(); //为了清晰,每次显示5行
}
cout<<"关键字总数为:"<<cont<<endl;
Select(Input());
break; case 3:
cout<<"请输入你想要查找的关键字: ";
cin>>word;
cout<<endl;
Show(FindHX(word));
Select(Input());
break; case 4:
cout<<"\t冲突关键字列表"<<endl<<endl;
count=0;
for(i=0;i<HASHLEN;i++)
{
if(strlen(HS[i].keyword)>0)
{
key=GetKey(HS[i].keyword);
if(key!=i)
{
count++;
cout<<"\t[关键字]: "<<HS[i].keyword<<endl;
cout<<"\t[哈希表当前位置]: "<<i<<endl;
cout<<"\t[冲突次数]: "<<HS[i].con<<endl<<endl;
}
}
}
if(count==0)
cout<<"没有冲突"<<endl;
else
cout<<"\t冲突关键字共:"<<count<<"个"<<endl;
Select(Input());
break; case 5:
cout<<" C语言中的关键字和其在哈希表的位置:"<<endl;
for(i=0;i<TOTAL;i++)
{
cout<<setiosflags(ios::left)<<"["<<setw(2)<<GetKey(KeyWords[i])<<"]"
<<setiosflags(ios::left)<<setw(11)<<KeyWords[i];
if((i+1)%5==0) cout<<endl;
}
cout<<endl;
Select(Input());
break; case 6:
jiemian();
Select(Input()); case 7:
break;//退出 default:
Select(Input());
return;
}
}int Read(char *filename) //读取文件
{
char word[MAXLEN],ch;
int i;
FILE *read; if( (read=fopen(filename,"r"))==NULL ) //只读方式打开一个文本文件,只允许读数据
{
cout<<"文件不存在,请确认好再输入!"<<endl;
return -1;
}
ResetHX(); //读取文件前先清空哈希表
while(!feof(read)) //feof()是文件结束检测函数,如果没有结束,返回值是0,结束了是1
{
i=0;
ch=fgetc(read); //读取一个字符
while(isLetter(ch)==0 && feof(read)==0 ) ch=fgetc(read);
//如果不是字母的话接着读取
while(isLetter(ch)==1 && feof(read)==0 )
{
if(i==MAXLEN)
{
while(isLetter(ch)==1&& feof(read)==0)
{
ch=fgetc(read);
}
i=0;
break;
}
//超过关键字长度将跳过当前识别区域,读取后一单词
else
{ //将连续读取的字母存在数组里,组成一个单词
word[i++]=ch;
ch=fgetc(read);
}
}
word[i]='\0'; //字符数组的结束标志
if(isKeyWords(word))
{
CreatHX(word);
}
}
fclose(read);
cout<<"读取成功,文件中关键字已经存入hash表,请继续操作"<<endl;
jiemian();
return 1;
}int isLetter(char ch) //判断是否是字母,因为关键字都是英文单词
{
if( (ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z') ) return 1;
else return 0;
//是字母就返回1,否则返回0值
} int FindHX(char *keyword) //查找哈希表,分块查找
{
int key,find,tem=0; if(!isKeyWords(keyword)) return -1;
key=GetKey(keyword);
if(strcmp(HS[key].keyword,keyword)==0) return key; for(find=key+1;find<HASHLEN;find++)
{ //线性探查法顺序查找哈希表中是否已存在关键字
tem++; //统计冲突次数
if(strcmp(HS[find].keyword,keyword)==0){
HS[find].con=tem;
return find; }
} for(find=0;find<key;find++)
{
tem++;
if(strcmp(HS[find].keyword,keyword)==0){
HS[find].con=tem;
return find; }
}
return -1;
} int CreatHX(char *keyword) //建立哈希表
{
int key;
if(!isKeyWords(keyword)) return -1;
key=GetKey(keyword); //计算哈希值 if(strlen(HS[key].keyword)>0) //判断关键字表中该位置是否存在关键字
{ //已经存在有关键字
if(strcmp(HS[key].keyword,keyword)==0)
{ //再判断哈希表中该位置的关键字是否相同
HS[key].count++;
return 1;
}
key=FindHX(keyword); //不相同,继续查找
if(key<0)
{
key=GetFreePos(GetKey(keyword));
if(key<0) return -1;
strcpy(HS[key].keyword,keyword); //将关键字插入哈希表
} if(key<0) return -1;
HS[key].count++;
}
else //该位置为空,直接将关键字插入该位置中
{
strcpy(HS[key].keyword,keyword);
HS[key].count++;
}
return 1;
}int GetFreePos(int key) //在哈希表中给关键字找个位置插进去
{
int find,tem=0;
if(key<0||key>=HASHLEN) return -1;
for(find=key+1;find<HASHLEN;find++) //先找后面的位置
{
tem++;
if(strlen(HS[find].keyword)==0){
HS[find].con=tem;
return find; }
} for(find=0;find<key;find++) //再找前面的位置
{
tem++;
if(strlen(HS[find].keyword)==0){
HS[find].con=tem;
return find; }
}
return -1; //哈希表已满
}void ResetHX() //重置哈希表,
{
int i;
for(i=0;i<HASHLEN;i++)
{
strcpy(HS[i].keyword,""); //不能用等号赋值
HS[i].count=0;
HS[i].con=0;
}
} int GetKey(char *keyword) //哈西函数
{ //Hash函数为:Hash(Key)=[(Key的首字母序号)*100+(Key的尾字母序号)] Mod 41
return ( keyword[0]*100+keyword[strlen(keyword)-1] ) % 41; //这里不要忘了减1
} int isKeyWords(char *word) //判断是否关键字
{
int i;
for(i=0;i<TOTAL;i++)
if(strcmp(word,KeyWords[i])==0) return 1;
return 0;
}