Foxtable(狐表)用户栏目专家坐堂 → 数组排序出错,帮忙给分析下吧


  共有2054人关注过本帖树形打印复制链接

主题:数组排序出错,帮忙给分析下吧

帅哥哟,离线,有人找我吗?
zpsun2003
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:130 积分:1250 威望:0 精华:0 注册:2018/4/19 21:34:00
数组排序出错,帮忙给分析下吧  发帖心情 Post By:2019/6/20 23:44:00 [只看该作者]

下面一段代码是实现多个数组排序的,但是排序出现了错误,帮忙分析下吧
定义了一个排序数组的函数szpx:

For i As Integer = 1 To args.length-1
    Dim pxsz(args(0).length-1) As Double   '定义一个数组pxsz
    args(0).CopyTo(pxsz, 0)
    Array.Sort(pxsz,args(i))  'pxsz数组为排序数组,args(i)数组跟随pxsz数组排序
Next
Array.Sort(args(0))  '对args(0)数组进行排序
'多个数组跟随第一个数组排序

以下是引用szpx函数的代码:

‘按照jhdyccs1的长度将下面几个数组重新定义长度
    redim Preserve cbjgszzz1(jhdyccs1)
    redim Preserve txzjtxdzszzz1(jhdyccs1)
    redim Preserve txczydzbszzz1(jhdyccs1)
    redim Preserve dyzsszzz1(jhdyccs1)
    redim Preserve dyxghszzz1(jhdyccs1)
    redim Preserve dyxgkszzz1(jhdyccs1)
    redim Preserve dydtezxjlszzz1(jhdyccs1)
    redim Preserve gycsszzz1(jhdyccs1)
    redim Preserve gyxghszzz1(jhdyccs1)
    redim Preserve gyxgkszzz1(jhdyccs1)
    redim Preserve dyydgsszzz1(jhdyccs1)
    redim Preserve gyydgsszzz1(jhdyccs1)
    redim Preserve dybydgsszzz1(jhdyccs1)
    redim Preserve zkdccszzz1(jhdyccs1)
    redim Preserve gybydgsszzz1(jhdyccs1)

   ‘进行数组排序’ Functions.Execute("szpx",cbjgszzz1,txzjtxdzszzz1,txczydzbszzz1,dyzsszzz1,dyxghszzz1,dyxgkszzz1,dydtezxjlszzz1,gycsszzz1,gyxghszzz1,gyxgkszzz1,dyydgsszzz1,gyydgsszzz1,dybydgsszzz1,zkdccszzz1,gybydgsszzz1)

‘按照bjdx-1的长度截取数组
    redim Preserve cbjgszzz1(bjdx-1)
    redim Preserve txzjtxdzszzz1(bjdx-1)
    redim Preserve txczydzbszzz1(bjdx-1)
    redim Preserve dyzsszzz1(bjdx-1)
    redim Preserve dyxghszzz1(bjdx-1)
    redim Preserve dyxgkszzz1(bjdx-1)
    redim Preserve dydtezxjlszzz1(bjdx-1)
    redim Preserve gycsszzz1(bjdx-1)
    redim Preserve gyxghszzz1(bjdx-1)
    redim Preserve gyxgkszzz1(bjdx-1)
    redim Preserve dyydgsszzz1(bjdx-1)
    redim Preserve gyydgsszzz1(bjdx-1)
    redim Preserve dybydgsszzz1(bjdx-1)
    redim Preserve zkdccszzz1(bjdx-1)
msgbox( 310 & " " & cbjgszzz1(309) & "  " & gyydgsszzz1(309) & "  " & dybydgsszzz1(309) & "  " & zkdccszzz1(309) & "  " & gybydgsszzz1(309))
‘此时输出的数值为:310 48166.53 4 0 17.5 4’
msgbox( 311 & " " & cbjgszzz1(310) & "  " & gyydgsszzz1(310) & "  " & dybydgsszzz1(310) & "  " & zkdccszzz1(310) & "  " & gybydgsszzz1(310))
‘此时输出的数值为:310 48166.53 3 0 19 3’
(以上的数值是正确的)
   ‘再次进行数组排序’ Functions.Execute("szpx",cbjgszzz1,txzjtxdzszzz1,txczydzbszzz1,dyzsszzz1,dyxghszzz1,dyxgkszzz1,dydtezxjlszzz1,gycsszzz1,gyxghszzz1,gyxgkszzz1,dyydgsszzz1,gyydgsszzz1,dybydgsszzz1,zkdccszzz1,gybydgsszzz1)

msgbox( 310 & " " & cbjgszzz1(309) & "  " & gyydgsszzz1(309) & "  " & dybydgsszzz1(309) & "  " & zkdccszzz1(309) & "  " & gybydgsszzz1(309))
‘此时输出的数值为:310 48166.53 3 0 17.5 3’
msgbox( 311 & " " & cbjgszzz1(310) & "  " & gyydgsszzz1(310) & "  " & dybydgsszzz1(310) & "  " & zkdccszzz1(310) & "  " & gybydgsszzz1(310))
‘此时输出的数值为:310 48166.53 4 0 19 4’

再次排序后就出现了错误,不知道哪出错了。请老师帮忙分析一下。是排序数组有问题,还是数组截取后发生了什么变化呢

 回到顶部
帅哥哟,离线,有人找我吗?
zpsun2003
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:130 积分:1250 威望:0 精华:0 注册:2018/4/19 21:34:00
  发帖心情 Post By:2019/6/21 8:44:00 [只看该作者]

问题应该出现在第一个排序数组cbjgszzz1相同的时候

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107727 积分:547968 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/6/21 9:11:00 [只看该作者]

请上传具体实例测试

 回到顶部
帅哥哟,离线,有人找我吗?
zpsun2003
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:130 积分:1250 威望:0 精华:0 注册:2018/4/19 21:34:00
  发帖心情 Post By:2019/6/21 9:31:00 [只看该作者]

Dim cbjgszzz1() As Double = {48166,48166.53,48166.53,148170}    ' =  cbjgcs_x1    '成本价格

Dim dyydgsszzz1() As Integer = {2,3,4,6 }   '  dyydgscs_x1  '低压油道个数
Dim dybydgsszzz1() As Integer = {3,4,5,7}    '  dybydgscs_x1  '低压半油道个数
Dim zkdccszzz1() As Double = {16.5,18,19,20}    '  zkdcccs_x1   '主空道尺寸
Functions.Execute("szpx",cbjgszzz1,dyydgsszzz1,dybydgsszzz1,zkdccszzz1)
For i As Integer = 0 To 3
    Output.Show( i+1 & " " & cbjgszzz1(i) & "  " & dyydgsszzz1(i) & "  " & dybydgsszzz1(i) & "  " & zkdccszzz1(i))
Next
‘第一次排序后输出的结果为
1 48166  2  3  16.5
2 48166.53  4  5  18
3 48166.53  3  4  19
4 148170  6  7  20
以上的数据是正确的
Functions.Execute("szpx",cbjgszzz1,dyydgsszzz1,dybydgsszzz1,zkdccszzz1)
For i As Integer = 0 To 3
    Output.Show( i+1 & " " & cbjgszzz1(i) & "  " & dyydgsszzz1(i) & "  " & dybydgsszzz1(i) & "  " & zkdccszzz1(i))
Next
‘再次排序后
1 48166  2  3  16.5
2 48166.53  3  4  18
3 48166.53  4  5  19
4 148170  6  7  20
就出现了错误,第二行和第三行排序就出错了,错误都出现在排序数组中,数值相同的情况

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/6/21 9:37:00 [只看该作者]

第一个数组相同的时候,是无法再按照你预想的,根据另外数值大小排序的。array.sort没有这种功能。

 

你可以变通处理一下,循环第一个数组,假如值为 (10,5,9,4,4),另一个数组为(1,2,3,4,2),把第一个数组改成(10-01, 05-02, 09-03, 04-04, 04-02),然后再排序。


 回到顶部
帅哥哟,离线,有人找我吗?
zpsun2003
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:130 积分:1250 威望:0 精华:0 注册:2018/4/19 21:34:00
  发帖心情 Post By:2019/6/21 10:05:00 [只看该作者]

老师,有几个问题请教下:
1、之前我这算法没有改过,没有出现过这种错误,近期突然出现的,和版本升级有没有关系呢?
2、刚才我试了下:第一个数组是double类型的,后面排序的数组不是都出错,后面也是double类型的就没事,integer类型的就不行,我都改成double类型的也没事了;
3、现在是2次排序转换,第一次排序正确,第二次排序时出错,我又增加了一次排序转换,第三次排序又正确了。
通过第二或第三种方式可靠吗?
4、把数组改为(10-01, 05-02, 09-03, 04-04, 04-02)这种方式,数值类型变为字符型的了,我这个数组数据存储量比较大,有时到几千万或上亿,现在我是通过数组达到20万后就排序,通过redim的方式保留10000个,总共最终不会超过20万个,这样没出现过内存溢出的情况,但这些数组类型都是数值型的,是不是可以自动释放,要改为字符型数组后,会不会出现因为无法释放导致内存溢出的情况呢

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/6/21 10:26:00 [只看该作者]

1、和你说的double没有关系,结果一样不对

 

Dim ary1() As Double = {10,5,9,4,4}
Dim ary2() As Double = {1,2,3,4,2}
'Dim pxsz(ary1.length-1) As Double   '定义一个数组pxsz
'ary1.CopyTo(pxsz, 0)
'Array.Sort(pxsz,ary2)  'pxsz数组为排序数组,args(i)数组跟随pxsz数组排序
array.sort(ary1, ary2)
For Each s As String In ary2
    output.show(s)
Next

 

2、参考代码

 

Dim ary1() As Double = {10,5,9,4,4}
Dim ary2() As Integer = {1,2,3,4,2}
Dim pxsz(ary1.length-1) As String   '定义一个数组pxsz
For i As Integer = 0 To ary1.length-1
    pxsz(i) = Format(ary1(i), "000") & Format(ary2(i), "000")
Next
Array.Sort(pxsz,ary2)  'pxsz数组为排序数组,args(i)数组跟随pxsz数组排序

For Each s As String In ary2
    output.show(s)
Next

 


 回到顶部
帅哥哟,离线,有人找我吗?
zpsun2003
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:130 积分:1250 威望:0 精华:0 注册:2018/4/19 21:34:00
  发帖心情 Post By:2019/6/21 11:08:00 [只看该作者]

Dim pxsz(ary1.length-1) As String   '定义一个数组pxsz
老师,我试一下。这个字符型数组,向里面赋值到20万个后,再取出最小的1万个,总共赋值多的时候要上亿,但最终这个数组中存储的数量最多不会超过20万,由于是字符型的,这种情况内存溢出的可能性大吗?

 回到顶部
帅哥哟,离线,有人找我吗?
zpsun2003
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:130 积分:1250 威望:0 精华:0 注册:2018/4/19 21:34:00
  发帖心情 Post By:2019/6/21 11:13:00 [只看该作者]

还有,我用之前的Foxtbale版本和现在的版本测试了以下的代码,确实不一样,之前版本输出结果是没问题的。将dyydgsszzz1()和dybydgsszzz1()改为double类型后,结果也对了。
搞不清楚是怎么回事,是array.sort这个函数本身的问题?还是我再szpx函数中定义了pxsz的类型也是double型的?


Dim cbjgszzz1() As Double = {48166,48166.53,48166.53,148170}    ' =  cbjgcs_x1    '成本价格

Dim dyydgsszzz1() As Integer = {2,3,4,6 }   '  dyydgscs_x1  '低压油道个数
Dim dybydgsszzz1() As Integer = {3,4,5,7}    '  dybydgscs_x1  '低压半油道个数
Dim zkdccszzz1() As Double = {16.5,18,19,20}    '  zkdcccs_x1   '主空道尺寸
Functions.Execute("szpx",cbjgszzz1,dyydgsszzz1,dybydgsszzz1,zkdccszzz1)
For i As Integer = 0 To 3
    Output.Show( i+1 & " " & cbjgszzz1(i) & "  " & dyydgsszzz1(i) & "  " & dybydgsszzz1(i) & "  " & zkdccszzz1(i))
Next
Functions.Execute("szpx",cbjgszzz1,dyydgsszzz1,dybydgsszzz1,zkdccszzz1)
For i As Integer = 0 To 3
    Output.Show( i+1 & " " & cbjgszzz1(i) & "  " & dyydgsszzz1(i) & "  " & dybydgsszzz1(i) & "  " & zkdccszzz1(i))
Next

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/6/21 11:15:00 [只看该作者]

假设你一个值的字符数是10个,如 0012300456,那么占用内容等于

 

10 * 1(字节) * 20万 = 200万byte = 200万 / 1000 kb = 2000 kb = 2mb

 

 

 


 回到顶部