2016-10-02 65 views
-4

有没有一种方法可以按字母顺序排列显示在同一行上的单词?我知道,如果我有一个新的一行字,我能够将它们轻松地使用排序:使用sort()对文件中的同一行进行排序

vector<string> file; 
string line; 
file.clear(); 
ifstream infile("foo.txt", ios_base::in); 
infile.seekg(3); 
while (getline(infile, line)){ 
    file.push_back(line); 
} 
sort(file.begin(), file.end()); 
ofstream outFile; 
outFile.open("foo.txt"); 
for (const auto &e : file) outFile << e << "\n"; 

但是如果话说得上的文件(用空格未分离的)在同一行,例如:catapebat(猫猿蝙蝠)。有没有简单的方法来在C++中做到这一点?我会不会做getline一点,因为我只抓住一条线?我将如何处理这个问题?

+1

要回答提出的问题:是的,有一个简单的方法在C++中执行此操作。 –

+0

您是否只需要在一行上对单词进行排序所需的基本编码?试图解析未被空格分隔的单词看起来像是一个单独的(而且更难)的问题。 – Zong

+2

你在一行上有非分隔的单词,并且想阅读它们吗?让我们说,而不是“猫”“猿”和“蝙蝠”,它包含“一个”和“完成”。没有空格,这是'adone',然后可以用不同的方式拆分为“ad”和“one”。你在这种模棱两可的情况下做什么?有没有一个允许的词的字典? – apnorton

回答

2
  1. 使用getline来读取一行。
  2. 从字符串的istringstream你刚才读
  3. 从那里读单词为vector<string>
  4. 排序的话在矢量
0

我会建议找一个单词字典,如this,并将每个单词与字符串的开头进行比较。如果匹配,则从字符串的开头删除多个字符,并将该单词存储在数组中。重复此操作直到获得包含所有单词的数组,然后按字母顺序对数组进行排序。

注意:这可能是值得通过整个字典和跟踪每个匹配的单词。一旦词典耗尽,请在继续之前选择最长匹配作为单词。

+0

这将如何处理像“飞机”或“未完成”这样的词,或者许多其他词可能是他们自己的词,还是更大的词的一部分? – Tas

+1

理论上它会将较大的复合词读作1个单词。一个最佳策略会尝试每个成功单词的组合。例如:“airplanesodapop”将产生输出:“空中,飞机,苏打水,流行音乐”,“飞机,sodapop”,“空中,飞机,sodapop”,“空中,飞机,sodapop” – Keco

相关问题