分析使用不同的数据结构的地址
最近,在MathWorks,赛斯决定为在他的博客上评论分析电子邮件域。他有趣的编写代码并在内部发布它。在很短的时间内,其他几个解决方案出现,其中包括利用的一个新特性金宝搏官方网站R2008b:containers.Map。让我们先看看问题本身。
内容
的电子邮件地址列表
赛斯想知道有多少评论这个博客来自各个领域,例如,在每个位置“@”的象征。
这是由电子邮件地址的列表来赛斯的评论。
s = {“0123456789 @uni.ac.za”“alphabet_a@yahoo.com”“alphabet_b@gmail.com”“alpahbet_c@hotmail.com”“dAlphabet@xyzabc.com”“e_alphabet@yahoo.co.in”“falphabet@gmail.com”“loren.shure@mathworks.com”“loren@mathworks.com”“alphabetG@hanme.com”“alphabetH@bname.com”“alphabet_I@yahoo.co.in”“andJ@gmail.com”“Khere@gmail.com”“L-Student@erau.edu”“M@gmx.de”};
使用正则表达式和cellfun赛斯的解决方案
赛斯第一次使用正则表达式确定的位置“@”符号在每个地址。
s1 = regexp(年代,“@ (\ w) +”,“匹配”,“一次”);
未来赛斯发现独特的域名,发现名字最长的长度(使用后帮他打印结果)。
sunique =独特(低(s1));n =细胞(长度(sunique), 1);mx = max (cellfun (@length sunique));
最后,赛斯打印结果。
为i = 1:长度(sunique) n{我}= (strmatch (sunique{},低(s1)));disp ([' 'sunique{我}repmat (' '[1 mx-length (sunique{我})))…' 'num2str (n{我}))结束
@bname.com 1 @erau.edu 1 @gmail.com 4 @gmx.de 1 @hanme.com 1 @hotmail.com 1 @mathworks.com 2 @uni.ac。咱1 @xyzabc.com 1 @yahoo.co。在2 @yahoo.com 1
使用containers.Map戴夫的解决方案
我展示的是另一种解决方案戴夫Tarkowski,使用一个containers.Map对象。戴夫开始采用赛斯的代码来查找匹配。
s1 = regexp(年代,“@ (\ w) +”,“匹配”,“一次”);
接下来,创建一个对象的类containers.Map。
m = containers.Map
m = containers.Maphandle Package: containers Properties: Count: 0 KeyType: 'char' ValueType: 'any'
遍历每个域,检查域名已经是一个关键的名字。
如果键不存在,创建它并将其值设置为1,否则现有键的值增加1。
为i = 1:长度(s1)如果m.isKey (s1{我})m (s1{我})= m (s1{我})+ 1;其他的米(s1{我})= 1;结束结束
最后,打印出数据。
为k =键(m) disp ([k {1}' 'num2str (m (k {1}))))结束
@bname.com 1 @erau.edu 1 @gmail.com 4 @gmx.de 1 @hanme.com 1 @hotmail.com 1 @mathworks.com 2 @uni.ac。咱1 @xyzabc.com 1 @yahoo.co。在2 @yahoo.com 1
containers.Map是什么?
containers.Map是一种数据结构通常称为哈希表或地图。您可以使用一个Java哈希表之前如果你设置为使用Java在MATLAB。现在你不再需要桥MATLAB-Java接口功能。的containers.Map这个数据结构类提供了一种节约内存的实现。MATLAB在类似的感觉结构体,一个容器。映射对象没有限制的关键(类似于一个领域结构体MATLAB是一个有效的标识符。键可以是任何下列之一:
- 标量整数(签名或无符号)
- 标量单引号或双
- 1 xn字符数组,甚至和嵌入空格
有一些方法可以使用这些对象。
方法(m)
类容器的方法。地图:地图findobj isKey长度移除addlistener findprop isvalid lt大小值删除通用钥匙ne subsasgn eq gt le通知subsref
史蒂夫的使用嘘和独特的解决方案
史蒂夫的主出现了不同的解决办法。用他的话说:
而不是使用正则表达式(因为我不能记得正则表达式语言)cellfun,我用strtok,嘘和第二个独特的调用。
把地址的符号
(T, R) = strtok(年代,“@”);
使用这一事实独特的给你b和k这样b {k}= =R。
(后缀,忽略,k) =独特(低(R));
使用这一事实独特的它的输出以及去除重复。发送相关的输出嘘。
(数量、指标)=嘘(k,独特的(k));
打印结果。
[后缀,num2cell(计数”)]。
ans =“@bname.com”[1]“@erau.edu”[1]“@gmail.com”[4]“@gmx.de”[1]“@hanme.com”[1]“@hotmail.com”[1]“@mathworks.com”[2]“@uni.ac。咱”[1]“@xyzabc.com”[1]“@yahoo.co。在“[2]“@yahoo.com”[1]
罗兰的解决方案使用strfind和accumarray
我来晚了这个游戏。之前看到任何解决方案除了赛斯的,我想金宝搏官方网站到了使用strfind定位领域,accumarray收集数据。
第1 = strfind(年代,“@”);印第安纳州allSuffixes = cellfun (@ (str) str(印第安纳州:结束),年代,第1,…“UniformOutput”、假);[uniqueSuffixes,忽略,uind] =独特(低(allSuffixes));%我疏忽使用accumarray如果没有解决方案数量= accumarray (uind 1[长度(uniqueSuffixes) 1]);[uniqueSuffixes num2cell(计数)
ans =“@bname.com”[1]“@erau.edu”[1]“@gmail.com”[4]“@gmx.de”[1]“@hanme.com”[1]“@hotmail.com”[1]“@mathworks.com”[2]“@uni.ac。咱”[1]“@xyzabc.com”[1]“@yahoo.co。在“[2]“@yahoo.com”[1]
其他方面,其他数据结构?
毫无疑问,是的,有其他的方式来完成同样的任务,包括计算之类的一些想法这篇文章。你有其他喜欢的方式做这种任务?除了containers.Map,其他数据结构在MATLAB你想看吗?像往常一样,请把你的想法在这里。
- 범주:
- 新功能
댓글
댓글을남기려면링크를클릭하여MathWorks계정에로그인하거나계정을새로만드십시오。