注册 登录
编程论坛 VB6论坛

统计数组中相同的字符串以及重复的次数

vbhello 发布于 2014-05-09 00:58, 8736 次点击
统计数组中相同的字符串以及重复的次数
例如:
c,4,k
m,3,e
9,f,s
2,5,3
9,f,s
输出结果为:
9,f,s出现的次数为2

c,4,k
m,3,e
9,f,s
2,5,3
2,5,3
9,f,s
2,5,3
输出结果为:
9,f,s出现的次数为2
2,5,3出现的次数为3

先谢谢各位的回复
14 回复
#2
alike1232014-05-09 08:57
这是个难点,不过刚好我有了灵感
1。先对数组排序
2。两两比较
多谢你提出来这个问题,以前我也遇到类似难题,现在突然有感觉了
#3
xzlxzlxzl2014-05-09 09:03
统计固定长度字符串字频好像不难哦,你要是给出需统计的字符串数组的来源代码,我肯定能帮你完成。
#4
风吹过b2014-05-09 09:51
一种方法:先排序,然后与前一个进行比较并进行统计。
二种方法:如果数据是保存在数据库里的,进行分组统计即可。

三种方法:如果查找指定的字符串在 一堆里出现的次数,可以使用
split 函数,来达到统计的目的。
按指定的字符串分解字符串后,统计有多少段,总段数-1 就是 出现的次数。
#5
vbhello2014-05-09 13:48
回复 2 楼 alike123
谢谢你的回复,两两比较的意思不是很懂
#6
vbhello2014-05-09 13:49
回复 3 楼 xzlxzlxzl
谢谢你的回复,下面是字符串数组的源代码:
    Dim s As String, a() As String
    s = "c,4,k" & vbCrLf & _
        "m,3,e" & vbCrLf & _
        "9,f,s" & vbCrLf & _
        "2,5,3" & vbCrLf & _
        "2,5,3" & vbCrLf & _
        "9,f,s" & vbCrLf & _
        "2,5,3"
    a = Split(s, vbCrLf)
#7
vbhello2014-05-09 14:03
回复 4 楼 风吹过 b
谢谢你的回复,
一:与前一个进行比较并进行统计不是很懂。是用两个FOR循环么?
for i = 0 to ubound(a) -1
    for j = i+1 to ubound(a)
        ......
    next j
next i
二:数据没有保存在数据库里,是保存在txt文档里的;
三:没有查找指定的字符串。
#8
风吹过b2014-05-09 17:05
例如:
c,4,k
m,3,e
9,f,s
2,5,3
2,5,3
9,f,s
2,5,3
排序后的结果是:
2,5,3
2,5,3
2,5,3
9,f,s
9,f,s
c,4,k
m,3,e

j=1        '计算有多少个不重复
'b()        '保存不重复的数据的内容
'c()        '对应出现的次数
b(1)=a(1)    '保存第一个字串
js=0
for i=2 to  ubound(a)
if a(i-1)=a(i) then     '如果等于前一个
   js=js+1        '计数
else
   c(j)=js        '保存前一个的计数值
   j=j+1          '向后移一个
   b(j)=a(i)      '保存字符串内容
   js=0           '计数器回零
end if
next i
#9
xzlxzlxzl2014-05-09 18:42
回复 6 楼 vbhello
想了好半天,好象不需要排序这么复杂的,用一个二维数组分别记录字符串和出现的次数就行了,代码如下:
Private Sub Command1_Click()
    Dim s As String, a() As String, b() As String, i As Integer, j As Integer, k As Integer
    s = "c,4,k" & vbCrLf & _
        "m,3,e" & vbCrLf & _
        "9,f,s" & vbCrLf & _
        "2,5,3" & vbCrLf & _
        "2,5,3" & vbCrLf & _
        "9,f,s" & vbCrLf & _
        "2,5,3"
    a = Split(s, vbCrLf)
    ReDim b(UBound(a), 1)
    k = 0
    For i = 0 To UBound(a)
    For j = k To 0 Step -1
    If a(i) = b(j, 0) Then
    b(j, 1) = Val(b(j, 1)) + 1
    Exit For
    End If
    Next
    If j < 0 Then
    b(k, 0) = a(i)
    b(k, 1) = 1
    k = k + 1
    End If
    Next
    Me.Cls
    For i = 0 To k - 1
    Print b(i, 0) & "出现" & b(i, 1) & "次"
    Next
End Sub
只有本站会员才能查看附件,请 登录
#10
lowxiong2014-05-09 19:05
比较实用的是对一篇文章中的字、词、句子的统计算法,被统计的字符是变长的,最后会形成一个哈夫曼树,作为压缩还原整篇文章的基础,这种算法还是非常拗口难懂的,尽管网上一大堆这方面的vb代码,但如果自己能独立写个出来,还是非常有成就感的。
#11
vbhello2014-05-10 00:35
回复 10 楼 lowxiong
感谢你的指导,可以请问下在哪里可以看到关于VB哈夫曼树这方面的代码么?我在百度搜不到适合的。
#12
lowxiong2014-05-10 00:47
我也没有,不过百度“哈夫曼编码vb源码”可以找到好多的,看这个:http://blog.
#13
vbhello2014-05-10 01:36
回复 12 楼 lowxiong
版主,我想问下:如果一篇文章重复的字很少,那经过哈夫曼树压缩岂不是占的空间变大了?(不知道是不是我对哈夫曼树的理解错了
#14
lowxiong2014-05-10 07:34
我对压缩方面也不熟悉,不过我觉得哈夫曼树肯定有剪枝算法,对一些权值小的或等于1的去掉,当所有字符都不重复时,压缩后的文件只比原文件长一个不大的文件头而已。再就是好像哈夫曼算法是压缩到bit的,比如你只有26个英文字母的话,就只需用5bit表示了,比1byte少用3bit。
#15
vbhello2014-05-10 19:06
谢谢大家的回复,问题已经解决。
最后感谢lowxiong版主让我了解到一个新的知识点(new for me),不过如果我要用到应用中估计还得了解一翻才行
1