简单的图书检索系统。
要求:对图书进行模糊查找。
给出一组书名,给出一个或多个检索单词,
将检索结果输出:按照检索单词的匹配个数的多少进行排序,匹配个数多的书名排在前面输出,如果匹配相同,则按照字母升序排序。
代码如下:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
//自定义类,存储在vector中。
class my
{
public:
my(int a,string str):times(a),str(str){}
int times;
string str;
bool operator<(const my &m)const
{
if (times==m.times)
return str<m.str;
else return times<m.times;
}
};
//自定义排序规则
bool op(const my &m1,const my &m2)
{
if(m1.times==m2.times)
return m1.str<m2.str;//按字母的升序排列string。
else return m1.times>m2.times;//按降序排列出现次数。
}
int main()
{
string str1;
char *p=new char[100];
my m(0,"");
vector<my> vmy;
int l=0;
//输入图书的名字,用回车隔开,结束用ctrl+z。
cout<<"enter books"<<endl;
while(gets(p))
{str1=p;
m=my(0,str1);
vmy.push_back(m);
}
//输入要查询的关键字,对于每个关键字,在每个书名中统计其出现次数,
//在一个书名中每找到一次该关键字,则该书名对映的times+1。
cout<<"enter key"<<endl;
while(gets(p))
{
str1=p;
l=str1.size();
for(int i=0;i<vmy.size();i++)
{
string::size_type j=0, k=0;
k=vmy[i].str.find(str1,j);
while(k!=string::npos)
{
vmy[i].times+=1;
j=k+l;
k=(vmy[i].str).find(str1,j);
}
}
}
//按照关键词出现的总次数对书名降序排序(即出现的次数越多则应靠前)
//对于次数相同的书名们,按照字母的升序排序(从a—>z)。
sort(vmy.begin(),vmy.end(),op);//sort(vmy.begin(),vmy.end());//也可以
//输出结果
for(int i=0;i<vmy.size();i++)
cout<<vmy[i].str<<endl;
return 0;
}