zoukankan      html  css  js  c++  java
  • C#集合之Hashtable

       Hashtable是一个键值对集合,其泛型版本是Dictionary<K, V>,下面说下常用的一些方法;

    1.Add(),向Hashtable添加元素,需要注意的是因为它是键值对集合,所以要同时添加一个键和一个值,且键不能重复。

    2.ContainsKey(key)方法,是查询是否包含某个键,其Contains()方法最终也是调用这个方法实现的。

    3.ContainsValue(value)方法,是查询是否包含某个值。

    4.hash[“key”],根据键获取某个值。hash[“key”]=“修改”,根据键修改对应的值。

    5.Remove(“key”);根据键删除对应的值。

    需要注意的是,以上3个方法,其泛型版本Dictionary<K, V>也是一样的。

    Keys属性,是Hashtable的键集合。Values属性,是Hashtable的值集合;可以通过foreach遍历它的键集合和值集合。

    如果要同时得到Hashtable中的键集合和值集合,在使用foreach遍历时,请将var关键字替换为DictionaryEntry,这样就能同时拿到键和值了。

    而对于Dictionary<K, V>要同时得到键集合和值集合,在使用foreach遍历时,请将var关键字替换为KeyValuePair<k,v>。

    键值对集合,如果得到键,可以使用 集合名[键名]这样的索引方式获取对应的值。因为键值对集合不提供下标来访问,故这类集合不能通过for循环来遍历。

    下面看几个例子程序,以便更好理解其实际应用:

    1.将int数组中的奇数放到一个新的int数组中返回

    int[] iArray = new int[] { 2, 7, 8, 3, 22, 9, 5, 11, 14, 18, 21 };
                ArrayList aLst = new ArrayList();
                for (int i = 0; i < iArray.Length; i++)
                {
                    if (iArray[i] % 2 != 0)
                    {
                        aLst.Add(iArray[i]);
                    }
                }
                object[] obj = aLst.ToArray();
                foreach (var item in obj)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
    

     2.从一个整数的List<int>中取出最大数(找最大值)(最简单是调用List集合的max方法)

     1 private static int GetMax(List<int> iList)
     2         {
     3             int iMax = iList[0];
     4             for (int i = 0; i < iList.Count; i++)
     5             {
     6                 if (iList[i]>iMax)
     7                 {
     8                     iMax = iList[i];
     9                 }
    10             }
    11             return iMax;
    12         }

    3.把123转换为:壹贰叁。

     1 /// <summary>
     2         /// 数字转换成大写汉字
     3         /// </summary>
     4         /// <param name="msg"></param>
     5         /// <returns></returns>
     6         private static string ConvertInt(string msg)
     7         {
     8             string s = "0零 1壹 2贰 3叁 4肆 5伍 6陆 7柒 8扒 9玖";
     9             Dictionary<char, char> dic = new Dictionary<char, char>();
    10 
    11             string[] strArray = s.Split(' ');
    12             for (int i = 0; i < strArray.Length; i++)
    13             {
    14                 dic.Add(strArray[i][0], strArray[i][1]);
    15             }
    16 
    17             StringBuilder sb = new StringBuilder();
    18 
    19             for (int i = 0; i < msg.Length; i++)
    20             {
    21                 if (dic.ContainsKey(msg[i]))
    22                 {
    23                     sb.Append(dic[msg[i]]);
    24                 }
    25                 else
    26                 {
    27                     sb.Append(msg[i]);
    28                 }
    29             }
    30             return sb.ToString();
    31         }

    4.计算字符串中每种字母出现的次数(面试题)。 “Welcome ,to Chinaworld”

     1             Dictionary<char, int> dic = new Dictionary<char, int>();
     2 
     3             for (int i = 0; i < msg.Length; i++)
     4             {
     5                 if (!dic.ContainsKey(msg[i]))
     6                 {
     7                     dic.Add(msg[i], 1);
     8                 }
     9                 else
    10                 {
    11                     dic[msg[i]] = dic[msg[i]] + 1;
    12                 }
    13             }
    14 
    15             foreach (KeyValuePair<char, int> item in dic)
    16             {
    17                 Console.WriteLine("字符<{0}>在文本中出现了{1}次", item.Key, item.Value);
    18             }

    延伸,如果是要统计一段中文中,某个词组呢?

     1 string msg = "患者:“大夫,我咳嗽得很重。”     大夫:“你多大年记?”     患者:“七十五岁。”     大夫:“二十岁咳嗽吗”患者:“不咳嗽。”     大夫:“四十岁时咳嗽吗?”     患者:“也不咳嗽。”     大夫:“那现在不咳嗽,还要等到什么时咳嗽?”";
     2             string key = "咳嗽";
     3             int iIndex = msg.IndexOf(key, 0);
     4             if (iIndex!=-1)
     5             {
     6                 Console.WriteLine("字符{0}第1次出现的位置是:{1}", key, iIndex);
     7             }
     8             
     9             int iCount = 1;
    10             while (iIndex != -1)
    11             {
    12                 iIndex = msg.IndexOf(key, iIndex + key.Length);
    13                 if (iIndex != -1)
    14                 {
    15                     iCount++;
    16                     Console.WriteLine("字符{0}第{1}次出现的位置是:{2}", key, iCount, iIndex);
    17                 }
    18                 else
    19                 {
    20                     break;
    21                 }
    22             }

    5.编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期,比如:二零一二年十二月月二十一日要转换为2012-12-21

     1 private static string ConvertDate(string strDate)
     2         {
     3             Dictionary<char, char> dic = new Dictionary<char, char>();
     4             string s = "零0 一1 二2 三3 四4 五5 六6 七7 八8 九9";
     5             string[] strArray = s.Split(' ');
     6             for (int i = 0; i < strArray.Length; i++)
     7             {
     8                 dic.Add(strArray[i][0], strArray[i][1]);
     9             }
    10 
    11             StringBuilder sb = new StringBuilder();
    12             for (int j = 0; j < strDate.Length; j++)
    13             {
    14                 if (dic.ContainsKey(strDate[j]))
    15                 {
    16                     sb.Append(dic[strDate[j]]);
    17                 }
    18                 else
    19                 {
    20                     if (strDate[j]=='')
    21                     {
    22                         //1.十  10    10
    23                         //2.二十 20   0
    24                         //3.十二 12   1
    25                         //4.二十二 22   不翻译
    26 
    27                         if (!dic.ContainsKey(strDate[j - 1]) && !dic.ContainsKey(strDate[j + 1]))
    28                         {
    29                             sb.Append("10");
    30                         }
    31                         else if (dic.ContainsKey(strDate[j - 1]) && !dic.ContainsKey(strDate[j + 1]))
    32                         {
    33                             sb.Append("0");
    34                         }
    35                         else if (!dic.ContainsKey(strDate[j - 1]) && dic.ContainsKey(strDate[j + 1]))
    36                         {
    37                             sb.Append("1");
    38                         }
    39                         else if (dic.ContainsKey(strDate[j - 1]) && dic.ContainsKey(strDate[j + 1]))
    40                         {
    41 
    42                         }
    43                     }
    44                     else
    45                     {
    46                         sb.Append(strDate[j]);
    47                     }
    48                 }
    49             }
    50             string n = sb.ToString().Replace('','-');
    51             n = n.Replace('', '-');
    52             return n.Replace('',' ');
    53         }

    上面代码中的中文注释还对不同情况做了判断。

    关于集合,先就说这么多,写出来算是给自己的总结,留作他日复习用。如果各路大神有补充,请跟我联系,共同进步啊!

  • 相关阅读:
    HDU 5912 Fraction (模拟)
    CodeForces 722C Destroying Array (并查集)
    CodeForces 722B Verse Pattern (水题)
    CodeForces 722A Broken Clock (水题)
    CodeForces 723D Lakes in Berland (dfs搜索)
    CodeForces 723C Polycarp at the Radio (题意题+暴力)
    CodeForces 723B Text Document Analysis (水题模拟)
    CodeForces 723A The New Year: Meeting Friends (水题)
    hdu 1258
    hdu 2266 dfs+1258
  • 原文地址:https://www.cnblogs.com/chens2865/p/3857629.html
Copyright © 2011-2022 走看看