书籍索引,如何查看每个单词并根据其第一个字母存储它

时间:2015-02-16 22:24:06

标签: c++ indexing char

我正在尝试从文件中读取文件,并将文件中所有单词的索引发送到与其首字母对应的数组

例如,

我的输入文件类似于

[1] 你好鲍勃 [2] 你好吗

我的输出应为

[A] 是,2 [B] 鲍勃,1 [H] 嗨,1 怎么样,2 [Y] 你,2

我创建了一个数组[10] - z [10],它将存储所有以'A'开头的单词 - 'Z' 我被困在如何检查单词的第一个字符,然后检查它是否属于ABC..etc数组,然后放入页码。

void Parser :: checkWord(){

if(buffer == 'a'){
    word<<a[];
}
if(buffer == 'b'){
    word<<b[];
}
if(buffer == 'c'){
    word<<c[];
}
if(buffer == 'd'){
    word<<d[];
}
if(buffer == 'e'){
    word<<e[];
}
if(x == 'f'){
    word<<f[];
}
if(x == 'g'){
    word<<g[];
}
if(buffer == 'h'){
    word<<h[];
}
if(buffer == 'i'){
    word<<i[];
}
if(buffer == 'j'){
    word<<j[];
}
if(buffer == 'k'){
    word<<k[];
}
if(buffer == 'l'){
    word<<l[];
}
if(buffer == 'm'){
    word<<m[];
}
if(buffer == 'n'){
    word<<n[];
}
if(buffer == 'o'){
    word<<o[];
}
if(buffer == 'p'){
    word<<p[];
}
if(buffer == 'q'){
    word<<q[];
}
if(buffer == 'r'){
    word<<r[];
}
if(buffer == 's'){
    word<<s[];
}
if(buffer == 't'){
    word<<t[];
}
if(buffer == 'u'){
    word<<u[];
}
if(buffer == 'v'){
    word<<v[];
}
if(buffer == 'w'){
    word<<w[];
}
if(buffer == 'x'){
    word<<x[];
}
if(buffer == 'y'){
    word<<y[];
}
if(buffer == 'z'){
    word<<z[];
}
}

2 个答案:

答案 0 :(得分:1)

这是您问题第二部分的解决方案。如何维护索引并为其生成一些输出。第一部分,我肯定会在其他答案中处理。

一旦您从文件中读取了您的单词并且您知道了所在的页面,您所要做的就是拨打UpdateIndex(...),如下面的代码所示。完成阅读后,请致电PrintIndex()以产生输出。

在UpdateIndex中,您还可以看到如何访问单词的第一个字符。

#include <string>
#include <cstdint>
#include <map>
#include <vector>
#include <iostream>

typedef std::vector<uint32_t> PageList;
typedef std::map<std::string,PageList > WordToPageMap;
typedef std::map<char,WordToPageMap > IndexMap;

void UpdateIndex( IndexMap& indexMap, const char * word, uint32_t page )
{
    if( strlen(word) > 0 )
    {
        indexMap[word[0]][word].push_back(page);
    }
}

void PrintIndex( const IndexMap& indexMap )
{
    for( auto& alpha : indexMap )
    {
        std::cout << "[" << alpha.first << "] ";
        for( auto& word : alpha.second )
        {
            std::cout << word.first << " ";
            for( auto& page : word.second )
            {
                std::cout << page << ",";
            }
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;
}

void TestIndexStuff()
{
    IndexMap indexMap;
    UpdateIndex( indexMap, "hi", 1 );
    UpdateIndex( indexMap, "bob", 1 );
    UpdateIndex( indexMap, "how", 2 );
    UpdateIndex( indexMap, "are", 2 );
    UpdateIndex( indexMap, "you", 2 );
    PrintIndex( indexMap );
}


int main(int argc, const char* argv[])
{
    TestIndexStuff();
    return 0;
}

运行它,产生如下输出:

 ./a.out
 [a] are 2,
 [b] bob 1,
 [h] hi 1,how 2,
 [y] you 2,

答案 1 :(得分:0)

我会使用正则表达式将您的输入分解为单词。然后使用每次单词实际上是页码时递增的变量来关注页码。 使用子字符串来切掉每个实际单词的第一个字母。 每次存储3个数据,将这些数据放入具有3列的数据表中会更容易吗? FirstLetter,PageNo和Word。 然后,当您读取整个文件时,您可以通过FirstLetter,PageNo对数据表进行排序,并迭代生成您的输出。