注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

代码字符统计  

2013-12-26 19:32:06|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

以前阅读了一个编程网站上的花边内容,大概是说的是程序员的代码中所使用的字符,统计出所使用的字符的排名。虽然这件事看起来有点,呃,无聊。而且,统计的结论并没有任何意义,如果说非要解读出什么内容的话,应该就是不同语言之间的关键字、类库等的不同,导致出现的频率差别较大吧,而且,碰上变态的程序员,使用a、aa、aaa做变量名称,会让结果更没有意义,就像刷数据一样,另外,一些使用喜好,例如使用while循环还是for循环,都会改变结果。虽然吐槽了这么多,但是这个事情还是有一点意思,那就是作为编程的练习还不错,下面是我写的控制台程序,有兴趣的童鞋可以考虑修改为窗体程序。

using System;
using System.IO;
using System.Collections.Generic;
namespace CodeCharacterCounter
{
   class CodeCharacterCounter
   {
       static Dictionary<char, int> CharSets = new Dictionary<char, int>();
       static StreamWriter sw = new StreamWriter(@"C:\stat.txt");
       static string[] filter = new string[] { "*.cs", "*.vb", "*.cpp", "*.c", "*.h" };
       static int TotalFiles = 0;
       static void Main(string[] args)
       {
           try
           {
               for (int i = 0x20; i < 0x7f; i++)
                   CharSets.Add(Convert.ToChar(i), 0);               
               CountADirectory(@"E:\Code Projects",filter);
               sw.WriteLine("=====================================");
               sw.WriteLine("Total Files:" + TotalFiles);
               sw.WriteLine("=====================================");
               foreach (KeyValuePair<char, int> k in SortDictionary(CharSets))
               {
                   Console.WriteLine(k.Key.ToString() + "\t" + k.Value.ToString());
                   sw.WriteLine(k.Key.ToString() + "\t" + k.Value.ToString());
               } 
           }
           catch (System.Exception ex)
           {
               Console.WriteLine(ex.Message);
           }
           finally
           {
               sw.Close();
               sw.Dispose();
           }
       }

       private static void CountADirectory(string folder,string[] fileFilter)
       {
           DirectoryInfo dir = new DirectoryInfo(folder);
           DirectoryInfo[] subdir = dir.GetDirectories();
           foreach (DirectoryInfo di in subdir)
               CountADirectory(di.FullName,fileFilter);
           List<FileInfo> FIL = new List<FileInfo>();           
           foreach (string s in fileFilter)
           {
               FileInfo[] files = dir.GetFiles(s);
               FIL.AddRange(files);
           }
           TotalFiles += FIL.Count;
           foreach (FileInfo fi in FIL)
           {
               Console.WriteLine(DateTime.Now.ToString()+"\t"+fi.FullName);
               sw.WriteLine(DateTime.Now.ToString() + "\t" + fi.FullName);
               sw.Flush();
               Statistics(fi.FullName);
           }
       }

       static void Statistics(string afile)
       {
           if(!File.Exists(afile))
               return;
           StreamReader sr = new StreamReader(afile);
           string context = sr.ReadToEnd();
           sr.Close();
           sr.Dispose();
           char[] chars = context.ToCharArray();
           foreach (char c in chars)
           {
               int cnt;
               if (CharSets.TryGetValue(c, out cnt))
               {
                   cnt++;
                   CharSets.Remove(c);
                   CharSets.Add(c, cnt);
               }
           }
       }

       private static Dictionary<char, int> SortDictionary(Dictionary<char, int> dic)
       {
           List<KeyValuePair<char, int>> myList = new List<KeyValuePair<char, int>>(dic);
           myList.Sort(delegate(KeyValuePair<char, int> s1, KeyValuePair<char, int> s2)
           {
               return s2.Value.CompareTo(s1.Value);
           });
           dic.Clear();
           foreach (KeyValuePair<char, int> pair in myList)
           {
               dic.Add(pair.Key, pair.Value);
           }
           return dic;
       }
   }
}
使用了文件夹迭代的方式,统计结果文件输入到了C盘根目录下,另外只统计了ASCII码中可打印的部分,我主要使用的语言是C#,偶尔也使用一下C++和VB,由于VS能自动生成许多代码,实际上手工编写的估计只有60%左右。统计结果如下:

  1105094
e 165960
t 150447
o 114107
i 107022
s 103188
n 95152
r 92701
a 86099
. 83447
l 65886
/ 58641
m 53594
u 51454
d 49342
; 41840
c 38588
p 37930
b 37339
( 34505
) 34503
S 32903
y 31472
h 31402
g 29965
= 27630
- 25005
" 23962
1 22216
w 21916
C 21300
x 21261
D 20999
* 18678
B 17238
A 15945
T 14946
2 14399
, 13913
v 12279
F 11767
f 10590
I 10197
0 10102
M 10072
} 9805
{ 9802
: 8842
P 8827
3 8504
L 8134
R 7845
E 7738
] 7548
[ 7547
_ 6985
O 6891
z 6042
W 6022
> 5686
< 5553
N 5275
4 5135
k 5117
G 4844
V 4462
5 3984
+ 3473
j 3298
7 3109
6 3023
H 2876
X 2240
8 2089
U 2085
9 2066
Z 2066
# 1565
K 1217
Q 1164
\ 1082
q 982
J 862
' 715
Y 691
& 657
! 638
| 381
@ 243
% 90
` 74
~ 67
? 64
$ 25
^ 23

代码字符统计 - Lemniscate - 信息,灵感,创新

 排名前十的按键(注意第十位为圆点“.”而不是大于号“>”)

空格键毫无争议地夺得了第一的位置,然后是单词中出现频率最高的字母e紧跟其后,但是没想到的是字母t居然比字母i出现的频率还高一些,因为我觉得我在使用for循环的时候总是for(int i=0;i<XXX;i++)等,这里面出现了四次i而只出现了一次t。

下面是数字0-9的使用频度:

代码字符统计 - Lemniscate - 信息,灵感,创新

 数字0,1和2远远多余其他数出现的频率啊~
  评论这张
 
阅读(650)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016