如何算出二维数组不同元素的个数,并放在一维数组里。谢谢!如下,是我的思路。但是元素个数很容易被后面元素的个数覆盖掉。
for i =0 to X
for j =0 to Y
for ni =i to X
for nj =j to Y
if A(i,j)=A(ni,nj) then 加入一维数组
next ni
next nj
next i
next j

解决方案 »

  1.   

    利用一个 ListBox,可以设置成不可见。Private Declare Function SendMessagebyString Lib "user32" Alias "SendMessageA" (ByVal hWND As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As LongPrivate Const LB_FINDSTRINGEXACT = &H1A2    '在 ListBox 中精确查找List1.Clear
    For i = 0 To X
    For j = 0 To Y
        n = SendMessagebyString(List1.hWnd, LB_FINDSTRINGEXACT, -1, A(i,j))
        If n = -1 then
            List1.AddItem A(i, j)
            List1.ItemData(List1.NewIndex) = 1
        Else
            List1.ItemData(n) =  List1.ItemData(n) + 1
        End If
    Next j
    Next iRedim number(List1.ListCount - 1)
    For i = 0 To List1.ListCount - 1
        number(i) = List1.ItemData(i)
        Debug.Print List1.List(i), List1.ItemData(i)
    Next i
    不知你弄到一维数组中的意图。那如何知道哪一个元素有多少呢?
      

  2.   

    你这样查下去,估计最后元素个数都是1,因为你第一次查到这个元素的时候,总数是对的,当你第二次又查这个元素的时候,总数就少了一个,但却把原来那个个数覆盖了。你需要用一个临时数组,把原始数组传递给临时数组,去查临时数组。查一个元素的时候,将查到的与它相等的元素都去掉,比如换成0或者换成负数,总之,换成你数组里不可能有的东西就行,这样,你再查的时候,加一个语句,if timparry(x)=0(或者你换成的东西)then exit for,就是当遇到你要过的项的时候,就不要再查了,这样,就应该不会错了,具体代码你自己写吧。
      

  3.   

    我不是程序员,不会写程序。但是直觉认为你的第二段里的思维逻辑有问题。
    “for ni =i to X
    for nj =j to Y
    这里的X,和,Y;不应该跟第一段
    for ni =i to X
    for nj =j to Y
    里面的X和Y等值,并使用同一坐标范围。如果是你写的这段,
    那么,实际上,ni=i to ??, 里面的i值已经到max值了;“ nj =j to ??”里面的j值也已经到max值了。那你后面两段的:
    next ni
    next nj
    next i
    next j实际上就是会被覆盖,而且没有办法循环。
    假设 i = 0 to 100;j =0 to 100; 那么你的ni 和 nj 实际上都是等于 0 to 100的。
    所以你的第二轮循环实际上就是等于第一轮循环。你不管怎么设置A(i,j)=A(ni,nj) ,最后结果都是 只有 next i 和 next j。不会编程,瞎猜的。自己看你的代码,感觉有问题。
      

  4.   

    我不是程序员,不会写程序。但是直觉认为你的第二段里的思维逻辑有问题。
    “for ni =i to X
    for nj =j to Y
    这里的X,和,Y;不应该跟第一段
    for ni =i to X
    for nj =j to Y
    里面的X和Y等值,并使用同一坐标范围。如果是你写的这段,
    那么,实际上,ni=i to ??, 里面的i值已经到max值了;“ nj =j to ??”里面的j值也已经到max值了。那你后面两段的:
    next ni
    next nj
    next i
    next j实际上就是会被覆盖,而且没有办法循环。
    假设 i = 0 to 100;j =0 to 100; 那么你的ni 和 nj 实际上都是等于 0 to 100的。
    所以你的第二轮循环实际上就是等于第一轮循环。你不管怎么设置A(i,j)=A(ni,nj) ,最后结果都是 只有 next i 和 next j。不会编程,瞎猜的。自己看你的代码,感觉有问题。
    不对。我的这段也有问题。连着几天换系统,找升级,有点累了。重新想了一下,你的这个外循环和内循环,还有不对的地方。如果外循环,
    for X =0 to X'
    for Y =0 to Y'
    next X
    next Y
    叠加一个范围,结束。
    那么,你等于外围预先定义了这个范围,内循环结束后,自动返回外循环。但你没有划分出来,等于一直在不停的做这个循环。相当于英语叫做BOX
    for nX =X to X'
    for nY =Y to Y'
    next nX
    next nY
    实际上没有起任何作用。等于不存在。如果要内循环成立的话,你得加另一层英语叫做box的东西,两个得分开。
    相当于计算时,有不同的范围界限。第一个外BOX里X,Y的范围是定义坐标双向值,第二个内BOX里,nX和nY是实际的坐标计算的数字移动值。当移动值得范围超过被定义的坐标值划分范围时,计算机没有办法计算了。要么消失,要么返回坐标原点,即 X=0,Y=0。那么,nX和nY, 这个时候也等于0. 因为计算机系统的计算是建立在维度假设上的,也就是物理假设上。如果超过假设的维度范围,那么计算全部失效。
      

  5.   

    感觉这里的二维数组纯粹是添乱的. 最终输出也只是一维数组而已.先要弄明白楼主的意图: 好像是把原数据中的重复项放进一个一维数组中去??? 是么如果是这样的话:
    1: 先申请一个(X+1)*(Y+1)大小的数组, 假装就是A1(Z), 其中 Z = (X+1)*(Y+1)-12: COPYMEMORY , 把二维数组A拷贝进一维数组A13:一维数组找重复也好不重复也好, 代码就简单多啦.