我想在给定的文本文件中查找一批关键字的索引/偏移量。 现在,我在stackoverflow上遇到了很多问题,但是回答this最为适合我。
这里唯一的问题是,以上问题仅提供了一个关键字的解决方案,而我要查找的关键字超过25个,而且我认为必须有比编写switch...case
或{{1 }}。
如何在此处优化任务?除了链接的问题之外,任何其他更好的方法都可以使用。
假设我的文本文件包含以下内容:
斯蒂芬·哈伦(Stephen Haren),12月9,4055551235
劳拉·克劳辛,1月23,4054447788
威廉·康纳,12月13日,123456789
Kara Marie,10月23日,1593574862
奥黛丽·卡里特(Audrey Carrit),1月16日,1684527548
塞巴斯蒂安·贝克(Sebastian Baker),10月23日,9184569876
我要查找的关键字是:
十二月,一月,三月,四月,五月
现在,输出应为:
12月:16
1月:第2行
if...else
的总体索引12月:第3行
January
的总体索引....
当前代码:
January
注意:此处也标记class Program
{
static void Main(string[] args)
{
var keyword = "December";
var keyword2 = "January";
int totalLength = 0;
using (var sr = new StreamReader("file.txt"))
{
while (!sr.EndOfStream)
{
var line = sr.ReadLine();
if (String.IsNullOrEmpty(line)) continue;
if (line.IndexOf(keyword, StringComparison.CurrentCultureIgnoreCase) >= 0)
{
Console.WriteLine("December: " + (totalLength + line.IndexOf(keyword, StringComparison.CurrentCultureIgnoreCase)));
}
if (line.IndexOf(keyword2, StringComparison.CurrentCultureIgnoreCase) >= 0)
{
Console.WriteLine("January: " + (totalLength + line.IndexOf(keyword, StringComparison.CurrentCultureIgnoreCase)));
}
.................
........................................................
totalLength += line.Length;
}
}
}
}
,因为我对方法感兴趣,而不是对特定于语言的解决方案感兴趣。
答案 0 :(得分:0)
我绝对建议您检查Trie数据结构。
一个很好的Tries实现将逐个字符搜索输入的文本,并在到达可识别单词的末尾时返回。 i.t.o非常高效运行时间(大约O(n + m)),并且在内存消耗方面也不错。 (仅供参考:在这种情况下,n是输入文本的长度,m是您要查找的单词的长度。)
我找到了有关该主题的以下教程:
https://www.geeksforgeeks.org/trie-insert-and-search/
这是我通过StackOverflow找到的一个很好的实现: