as you might know, if you put a ValueType inside an ArrayList, there are boxing/unboxing issuesbut any way, you could use a hashtable instead Hashtable ht = new Hashtable (); ArrayList list=new ArrayList();
for (int i=0;i<split.Length;i++) { if(split[i].Length>1) { StruWord sw; string sWord = split[i].ToLower(); if (ht.Contains(sWord)) { int n = (int)ht[sWord]; sw = (StruWord)list[n]; sw.inFreq++; list[n] = sw; } else { sw = new StruWord(); sw.word=sWord; sw.inFreq=1; sw.weight=0; sw.totalFreq=0; list.Add(sw); ht[split[i]] = list.Count - 1; }
Hashtable ht = new Hashtable ();
ArrayList list=new ArrayList();
for (int i=0;i<split.Length;i++)
{
if(split[i].Length>1)
{
StruWord sw; string sWord = split[i].ToLower(); if (ht.Contains(sWord))
{
int n = (int)ht[sWord];
sw = (StruWord)list[n];
sw.inFreq++;
list[n] = sw;
}
else
{
sw = new StruWord(); sw.word=sWord;
sw.inFreq=1;
sw.weight=0;
sw.totalFreq=0;
list.Add(sw); ht[split[i]] = list.Count - 1;
}
}
} foreach (StruWord sw in list)
{
Console.WriteLine("{0} = {1}", sw.word, sw.inFreq);
}
ht[split[i]] = list.Count - 1; // ?是不是应该是:
ht.Add(split[i], list.Count - 1); 见笑了。
{
if(split[i].Length>1)
{
StruWord sw; string sWord = split[i].ToLower(); if (ht.Contains(sWord))
{
sw = (StruWord)ht[sWord];
sw.inFreq++;
ht[sWord] = sw;
}
else
{
sw = new StruWord(); sw.word=sWord;
sw.inFreq=1;
sw.weight=0;
sw.totalFreq=0;
ht[sWord] = sw;
}
}
} foreach (string s in ht.Keys)
{
Console.WriteLine("{0} = {1}", s, ((StruWord)ht[s]).inFreq);
}
我还是通过重新添加的办法解决了问题(代码如下),但是看了思归的方法,自愧相差太远
学习了。for(int m=0;m<list.Count-1;m++)
{
for(int n=m+1;n<list.Count;n++)
{
if(((StruWord)list[m]).word==((StruWord)list[n]).word)
{
StruWord struWord2;
struWord2.inFreq=((StruWord)list[m]).inFreq+1;
struWord2.totalFreq=0;
struWord2.weight=0;
struWord2.word=((StruWord)list[m]).word;
list.RemoveAt(m);
list.Insert(m,struWord2);
list.RemoveAt(n);
n=n-1;
}
}
}