我应该阅读一个文本文件并以降序打印出单词出现的频率,但是“单词被认为是连续字母的任何序列,在字母之前或之后都没有”。
我是否可以将wordBreak chars定义为英语字母以外的任何内容,或者以某种方式使用Regex?
例如,使它能够使程序将字符串“ a198 $a1a1a'ača”识别为单词“ a”,其频率为6。
{
char[] wordBreak = new char[] { ' ', ',', ';', '.', '/', '\"', '[', ']', '!'};
var wordFreq = new Dictionary<string, int>();
using (var fileStream = File.Open("text.in", FileMode.Open, FileAccess.Read))
using (var streamReader = new StreamReader(fileStream))
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
var words = line.Split(wordBreak, StringSplitOptions.RemoveEmptyEntries);
foreach (var word in words)
{
if (wordFreq.ContainsKey(word))
{
wordFreq[word]++;
}
else
{
wordFreq.Add(word, 1);
}
}
}
}
}
答案 0 :(得分:2)
是的,您可以使用Regex
。例如:
MatchCollection matches = Regex.Matches("a198$a1a1a'ač a", "[a-zA-Z]+");
var wordFreqs = matches
.Cast<Match>()
.GroupBy(a => a.Value)
.OrderByDescending(a => a.Count())
.Select(a => new { Word = a.Key, Freq = a.Count() });
foreach (var wordFreq in wordFreqs)
Console.WriteLine($"\"{wordFreq.Word}\" occurs {wordFreq.Freq} times");
答案 1 :(得分:1)
执行此操作的一种方法是简单地逐字符遍历字符串。如果字符是字母,则将其附加到currentWord
字符串中。如果它不是字母,并且currentWord
有一些字符,则可以将该单词添加到字典中(值为1
),或者如果该单词已经存在,则增加该单词的计数:
private static Dictionary<string, int> GetWords(string input)
{
var result = new Dictionary<string, int>();
if (string.IsNullOrWhiteSpace(input)) return result;
var currentWord = "";
foreach (var chr in input)
{
if (char.IsLetter(chr))
{
currentWord += chr;
}
else if (currentWord.Length > 0)
{
if (result.ContainsKey(currentWord)) result[currentWord]++;
else result.Add(currentWord, 1);
currentWord = "";
}
}
if (currentWord.Length > 0)
{
if (result.ContainsKey(currentWord)) result[currentWord]++;
else result.Add(currentWord, 1);
}
return result;
}
在使用中,您只需执行以下操作:
private static void Main(string[] args)
{
var words = GetWords("a198$a1a1a'ač a");
foreach (var word in words)
{
Console.WriteLine($"The word '{word.Key}' occurrs {word.Value} times.");
}
GetKeyFromUser("\nDone! Press any key to exit...");
}
输出
答案 2 :(得分:1)
好的,我做到了,而且可行,但是可能有更好的方法做到这一点。
{{1}}