字符串按首字母分组并ToDictionary的实现

  这是携程(深圳).net开发笔试的一道题目,要求实现字符串按首字母分组并ToDictionary输出,当时没有做出来,后面研究了一下,现在将这道题的几种实现方式记录下来。

首先初始化数据源,是一个List<string>对象。如下代码。


//数据源
List<string> list = new List<string>
{
"Beijing", "Shanghai", "Tianjin", "Chongqing", "Harbin", "Dalian", "Qingdao", "Xi‘an",
"Dunhuang", "Nanjing", "Wuxi", "Suzhou", "Yangzhou", "Zhenjiang", "Hangzhou", "Xitang",
"Zhoushan", "Chun‘an", "Qiandaohuzhen", "Shaoxing", "Huangshan", "Jiujiang", "Xiamen",
"Wuyi Shan", "Zhangjiajie", "Chengdu", "Shenzhen", "Zhuhai", "Guangzhou", "Guilin",
"Kunming", "Xishuangbanna", "Dali", "Lijiang", "Guiyang", "Urumqi", "Turpan", "Lhasa"
};

第一种分组方法,使用正则表达式,代码如下。


        /// <summary>
/// 使用正则表达式匹配
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static string GetGroupNameByRegex(char str)
{
string sInput = str.ToString();
if (Regex.IsMatch(sInput, "[a-gA-G]", RegexOptions.IgnoreCase))
{
return "A-G";
}
if (Regex.IsMatch(sInput, "[h-nH-N]", RegexOptions.IgnoreCase))
{
return "H-N";
}
return "O-Z";
}

第二种方法,直接比较两个char,代码如下。


        /// <summary>
/// 方法二:使用字符的ASCII码大小匹配
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static string GetGroupNameByCharASCII(char str)
{
if ((str >= ‘a‘ && str <= ‘g‘) || (str >= ‘A‘ && str <= ‘G‘)) //char可以隐式地转换为int
{
return "A-G";
}
if ((str >= ‘h‘ && str <= ‘n‘) || (str >= ‘H‘ && str <= ‘N‘))
{
return "H-N";
}
return "O-Z";
}

注意,两个char之所以能直接比较大小,实际上char先被转换成了int,也就是对应的ASCII码,然后才进行比较大小的。

第三种方法,实际上跟第二种方法相同,只不过在方法二的基础上进行了优化,代码如下。


        /// <summary>
/// 方法二的升级版
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static string GetGroupNameByCharASCII1(char str)
{
char newChar = Char.ToLower(str);
//if (newChar >= ‘o‘)
//{
// return "O-Z";
//}
//if (newChar>=‘h‘)
//{
// return "H-N";
//}
//return "A-G";
return newChar >= ‘o‘ ? "O-Z" : newChar >= ‘h‘ ? "H-N" : "A-G";
}

需要注意的是,方法三的写法,多个if...else...语句可以使用三元操作符来化简,使代码更优雅。

输出结果,代码如下。


var query = list.GroupBy(p =>
{
return GetGroupNameByRegex(p[0]);
}).ToDictionary(p => p.Key, p => p);
foreach (var item in query)
{
Console.WriteLine("{0}", item.Key);//IGrouping<TKey,TValue>
foreach (var subItem in item.Value)
{
Console.WriteLine(" {0}", subItem);
}
}
Console.ReadKey();

输出结果截图如下。

时间: 2024-11-06 03:52:42

字符串按首字母分组并ToDictionary的实现的相关文章

本地化下按首字母分组排序的神器——UILocalizedIndexedCollation

最近在整一个很简单的通讯录相关的项目,通讯录当然就少不了按首字母或者汉字拼音首字母分组排序索引.因为按照我一贯的的做法,都是想要做成更通用的.支持本地化的,所以这就纠结了,世界各地的语言啊我去,我顶多也就认识中文和英语,这就不能用以前的那些比如把汉字转成拼音再排序的方法了,效率不高不说,对其他国家的本地化更是行不通.一个偶然的机会,我才发现SDK里已经提供了一个实现此功能的神器——UILocalizedIndexedCollation. 首先提一下,UILocalizedIndexedColla

String-需求把一个字符串的首字母转成大写,其余为小写(只考虑英文大小写字母字符)

package cn.lianxi; public class DaXiao { public static void main(String[] args) { /*需求把一个字符串的首字母转成大写,其余为小写(只考虑英文大小写字母字符) * 分析: * 1.先获取第一个字符 * 2.获取除了第一个字符的以外字符 * 3.把第一个字符转成大写 * 4.把第一个字符转成大写 * 5.把除第一个字符以外的字符转成小写 * 6.字符串拼接 * */ String str = "helloWORLD&

sql中如何按某字段值的首字母分组?

sql中如何按某字段值的首字母分组?如一字段有值: x001 x003 p005 y0093 分组结果应为.X=2,p=1,y=1 ------解决方案--------------------如一字段有值: x001 x003 p005 y0093 分组结果应为.X=2,p=1,y=1 select left(col,1) , count(*) from tb group by left(col,1)

按首字母分组排序数组

1 2 3 // 按首字母分组排序数组 4 5 -(NSMutableArray *)sortObjectsAccordingToInitialWith:(NSArray *)arr { 6 7 8 9 // 初始化UILocalizedIndexedCollation 10 11 UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation]; 12 13 14 15 //得出col

fastjson将bean转成字符串时首字母变小写问题

一个项目需求要求返回值为JSON格式,且大多数字段是首字母大写,还有些是类似N_TX这样的格式,在输出这样的结果时遇到了问题,由于时间紧,就直接拷贝需要的结果字段建立JavaBean类,本以为最后直接调用JSON.toString(obj)返回结果即可,没想到返回值中自动将首字母变小写.查看fastjson源码发现关键在下面一段 public static List<FieldInfo> computeGetters(Class<?> clazz, Map<String, S

PHP获取中英文字符串的首字母

使用场景:在对地区进行筛选时,我们经常会看到按照英文字母进行筛选定位,起初想着是数据表里存储上地区与首字母关联关系,但是觉得太麻烦,然后就想着根据地区名称来获取首字母,然后对地区进行分组,由此便用到了如下方法: function getFirstCharter($str) { if (empty($str)) { return ''; } $fchar = ord($str{0}); if ($fchar >= ord('A') && $fchar <= ord('z')) r

把字符串的首字母转大写其他转小写

判断字符串的首字母 ---------startsWith

列: {                                            xtype : 'gridcolumn',                                            dataIndex : 'nrMid3bit',                                            text : 'Nr.mid',//零件号中间3位                                           

获取任意字符串的首字母. 原理:根据gb2312编码是按拼音排序

<?php $limit=array( //gb2312 拼音排序 array(45217,45252), //A array(45253,45760), //B array(45761,46317), //C array(46318,46825), //D array(46826,47009), //E array(47010,47296), //F array(47297,47613), //G array(47614,48118), //H array(0,0), //I array(48