今天群里提了一个小问题:给出一个字符串"abcabc12345612ab";能不能用某种方式去除重复 字符,输出 "abc123456"的形式.
我的想法是首先构造一个List,然后将打印后的字符传到List里面,如果List.Exists这个字符,就不输出,否则,添加到List里面,然后输出此字符.结果就差一秒啊,发现List.Exists 方法和我想的不一样,中间传的不是string,而是一个委托,晕(要用Contains).好好看看msdn,传送门在此,发现这个参数是一个委托,传入的是一个string参数,返回的是一个bool值.和Regex.Replace方法很像(指用法).看来委托确实很强大.虽然斗法失败,不过学习了一个新的知识,还好吧,哈哈.
其实我觉得值得推荐的是几种方法:
1.建立零时变量,存储待输出字符.(如我上面描述的那样)
static void Main()
{
string strTest = "abcabc12345612ab";
List<char> l = new List<char>();
foreach (char ch in strTest.ToCharArray())
{
if (!l.Contains(ch))
{
l.Add(ch);
}
}
System.Console.WriteLine(l.ToArray());
System.Console.ReadKey();
}
形如创建string,char[]等等都是这种方式.
这个应该是 【普通青年】
2.使用LINQ,或者说泛型的方法
static void Main()
{
string strTest = "abcabc12345612ab";
System.Console.WriteLine(strTest.ToCharArray().Distinct().ToArray());
System.Console.ReadKey();
}
这个我感觉是比较合理和简洁的,不过需要对 .Net 类库有很熟悉的认识.
【文艺青年】
3.使用正则表达式
static void Main()
{
string strTest = "abcabc12345612ab";
Regex reg = new Regex(@"(?'all'(?'start'.).*?)\k'start'");
while (strTest != (strTest = reg.Replace(strTest, "${all}"))) { }
System.Console.WriteLine(strTest); //abc123456
System.Console.ReadKey();
}
这个有点BT,虽然我个人很喜欢正则,但是这个实在有点狠.
分析了一下,大致的思路是:匹配一段字符串,这段字符的特点是:开始的字符和结尾的字符是一样的,比如"aba","123461".然后将结尾的字符去除,这样就减少了一个重复的字符,循环如此,直到字符串中没有重复的字符为止.向想出这种方法的q107770540( Tim [兔子党执行督察])致敬,佩服.
【变态青年】
END:条条大路通罗马,你是用什么方法来实现的呢?