遍历两个Arraylist中的字符串对(w,t),把这个对以及它出现的次数保存到哈希表中。
 
先看程序:                foreach (string w in arrdw) //此处arrdw和arrdt为ArrayList,其中保存了若干个英文单词。 
                {
                    foreach (string t in arrdt)
                    {
                        if (w == t)         //如果两个单词重复,则跳过,不进行计算。
                        {
                            Console.WriteLine("word----term: {0}", w);
                            continue; 
                        }
                        else
                        {
                            string[] a = {w,t};    //建立一个字符串组保存两个单词w,t
                            if (htwt[a] == null)   //如果这对单词第一次出现在哈希表中,则他们的值等于1; 
                            {
                                htwt[a] = 1;
                            }
                            else                   //如果不是第一次,则他们的值加一;(**)
                            {
                                htwt[a] = (int)htwt[a] + 1;
                                Console.WriteLine("word:{0}--------term: {1}------------Num: {2}", w, t, (int)htwt[a]);
                            }
                        }
                    }
                }
    程序就出现在两个*的那个位置,里面的代码不被运行, 即使出现了跟之前相同的单词对也不进行加值。 而是当做第一次出现保存到哈表中并赋予值“1”。  最后运行出来的结果是, 不管哈希表中的key是什么,他们的value全是“1”。
    是不是因为我在定义字符串组的时候出现了问题, 希望大家能给看看, 不知道怎么改啊~~~ 谢谢大家,给点建议~~~

解决方案 »

  1.   

    if (htwt[a] == null) //如果这对单词第一次出现在哈希表中,则他们的值等于1;  
      {
      htwt[a] = 1;
      }
    问题出现在这里,怎么判断是第一次出现在hashtable中呢 ,这样行吗?
    用hashtable.contains试试吧
      

  2.   

     if (htwt[a] == null) //如果这对单词第一次出现在哈希表中,则他们的值等于1;  
      {
      htwt[a] = 1;
      }
    这个位置出错啦,Arraylist是以键值对出现的
      

  3.   

    不行啊, 如楼上说的:
                                if (!htwt.Contains(a))
                                {
                                    htwt[a] = 1;
                                }
                                else
                                {
                                    htwt[a] = (int)htwt[a] + 1;
                                }
    还是一样,哈希表输出的值都是“1”。 他们包含有重复的key, 为什么不相加啊。
    是不是字符串组在存入哈希表的时候是以一个内存号码的形式存进去,而不是字符串本身啊
      

  4.   

    4楼的这么说, 那如何改啊 不用arraylist换成hashtable?
      

  5.   

    原因是.NET不知道怎么比较两个string数组(有很多种标准:是同一个引用才算,还是相同元素算? 还是相同集合就算?),比如下面例子中a就不等于b,对hash表而言,a和b都是第一次出现。解决方法就是提供一个相等的判断标准。这可以自己写一个class存放<w,t>并实现相等的判断,也可以直接用实现了相等判断的类(比如)KeyValuePair。string w = "w", t = "t";string[] a = { w, t };
    string[] b = { w, t };
    bool equal1 = a.Equals(b);          // <--false!KeyValuePair<string, string> kva = new KeyValuePair<string, string>(w, t);
    KeyValuePair<string, string> kvb = new KeyValuePair<string, string>(w, t);
    bool equal2 = kva.Equals(kvb);      // true
      

  6.   

    恩,知道了楼上说的对,我应该定义个比较字符串数组的class,然后再add到哈希表内。