我从文档中提取了标记并将它们插入到数组中。现在我想要的是确定令牌出现在文档中的次数。
我脑海中的本算法获取每个令牌并扫描整个令牌数组以找到类似的令牌。这是因为你猜测不是很可扩展。
我正在寻找其他一些好的算法来帮助我解决这个问题。
我在SO上有一些类似的问题,但他们都假设在编译时提供了令牌。
答案 0 :(得分:4)
使用ID为String(即令牌)和Integer(为计数)的Map / Hashmap。
这是你需要的逻辑。
对于每个令牌:
如果存在令牌,则通过令牌ID获取对象来增加计数并替换旧令牌
如果token不存在,则将token添加到map并将整数值设置为1。
答案 1 :(得分:4)
假设为了使例子容易“令牌”是整数。使用group by
将标记分区为等价类,然后计算每个组的大小。
var tokens = new[] { 10, 20, 30, 10, 30, 20, 20, 20, 10 };
var grouped = from token in tokens group token by token;
foreach (var grp in grouped)
Console.WriteLine("{0} {1}", grp.Key, grp.Count());
输出是:
10 3
20 4
30 2
答案 2 :(得分:1)
您可以使用HashMap<String,Integer>
(或SortedMap<String,Integer>
,如果您希望按字母顺序排列结果),其中key
是令牌,value
是计数。对于列表中的每个元素,您需要检查它是否已存在于地图中。如果不是,则创建值为1
的新密钥。如果已经存在,则只需将value
(计数)增加1。
HashMap<String,Integer> counts= new HashMap<String,Integer>() ;
for(String e: myTokenList ) {
if( counts.get(e) == null )
counts.put(e,1);
else
counts.put(e,counts.get(e)+1);
}
有一个可行的微观优化:
HashMap<String,Integer> counts= new HashMap<String,Integer>() ;
for(String e: myTokenList ) {
Integer c= counts.get(e) ;
if( c == null )
counts.put(e,1);
else
counts.put(e,c+1);
}
答案 3 :(得分:1)
不确定完全理解这个问题,但这就是如何对值(令牌)进行分组,然后计算它们出现的次数。
List<string> tokens = new List<string> { "A", "B", "A", "A", "B", "C"};
var tokensCount = tokens.GroupBy(g => g).Select(g => new KeyValuePair<string, int>(g.Key, g.Count()));
// Returns A 3, B 2, C 1
答案 4 :(得分:0)
好的,根据其他一些建议,请不要在文档中插入文档中的单词(除非您有充分的理由,但在您的问题中尚未突出显示)。
相反,将其插入地图/字典中,例如在下面的示例中(注意可以更有效地完成,但这显示了明确采取的每个步骤。)
var wordCounts = new Dictionary<string, int>();
var wordSeparators = new char[] {',', ' ', '\t', ';' /* etc */ };
using (var reader = File.OpenText("allmaywords.txt")
{
while (!reader.EndOfStream)
{
var words = reader
.ReadLine()
.Split(wordSeparators, StringSplitOptions.RemoveEmptyEntries)
.Select(f => f.Trim()).ToList();
foreach (var word in words)
{
if (!wordCounts.ContainsKey(word))
wordCounts[word] = 1;
else
wordCounts[word] = wordCounts[word] + 1;
}
}
}
现在,您还可以通过以下方式访问所有唯一字词(或代币):
var uniqueTokens = wordCounts.Keys;
您可以查看是否存在令牌:
var gotAFoo = wordCounts.ContainsKey("Foo");
它呈现的频率如何:
var numbeOfFoosGiven = wordCounts["Foo"];