求一排序函数
有一列表内数据如下1.JPG
4.JPG
22.JPG
3.JPG
8.JPG
11.JPG
16.JPG
2.JPG
。。。
如何将这类的数据进行排序呢。 --------------------编程问答-------------------- 怎么没有人呢。 --------------------编程问答-------------------- --------------------编程问答-------------------- 象楼主那样的数据,如果没有一个“确切的排序规则”,直接进行字符串比较来排序,未必就是楼主想要的效果。
需求都不清楚,何以去谈算法。
--------------------编程问答-------------------- VB初级码农的做法,界面上放一个隐藏的ListBox,设置Sort属性为True,然后把你的数据添加进去。
然后循环取出,就是排好序的了。 --------------------编程问答-------------------- 有些人,恐怕就会因此从“初级”引导到了“垃圾级”。
--------------------编程问答--------------------
无论什么规则,最后只不过是在过程里改点细节的问题,如数组类型为整形、日期类型,对比时的变量或大于小于条件改变一下而已,甚至是多条件分级别排序(类似SQL的排序需求),都可以这么弄出来,如文件的创建日期、文件类型、文件名等等综合条件的排序,无非就是弄个结构体,在循环时多设置几个判断条件就可以实现这种综合条件排序了,这种方法可以说适用于各种需求的排序处理,其使用的问题在于使用者是否理解这种排序方法,并能够融会贯通这种理念才好对其进行修改,如果还有问题就是实用的算法是否够快的问题,但经过测试,效率基本上还是能接受的。当然,这种过程也可以进一步封装,使得使用者可以很简单的对多条件数据进行排序,比如使用二维数组,然后加个优先级别参数,如:
Redim Files(1,3)
Files(0,0) = "4.jpg"
Files(0,1) = #2013-7-21 00:58:00#
Files(0,2) = "jpg"
Files(0,3) = 3000000
Files(1,0) = "2.jpg"
Files(1,1) = #2013-7-21 00:58:00#
Files(1,2) = "jpg"
Files(1,3) = 132701
' 调用排序过程
Call CompositorArray(Files,"2:asc,1:desc,0:asc,3:asc")
...
' 定义排序函数
Sub CompositorArray(ByRef arr() as Variant,ByVal PRI As String)
...
End Sub
这样一来这种过程的可重用性就会很强,实用性也很高,而且效率可以自己掌控(看自己的算法啦)。更为重要的是这是一种技术,而不是用某种工具,这种技术可以跨语言、跨平台的使用,我在做以前的一个单片机项目中就用过这种技术,主要处理任务队列,可以说解决了很大的问题,只不过单片机上的过程就没有 CompositorArray 这种结构复杂,是根据具体需求改出来的排序过程。 --------------------编程问答-------------------- 因为我用了LISTBOX,这样样的排序会按照字符排序,而不是数字排序 正确排序应该
1.JPG
2.JPG,
3.JPG
。。。
10.JPG
11.JPG
而LISTBOX的排序则是
1.jpg
10.JPG
11.jpg
12.jpg
...
2.JPG
21.jpg
22.jpg
....
3.jpg
31.jpg --------------------编程问答-------------------- 需求确实不到位 --------------------编程问答-------------------- 多加个识别条件,字符数量正序排序 --------------------编程问答--------------------
--------------------编程问答--------------------
Private Sub Command6_Click()
Dim DriverObject As Object, _
FileObject As Object, _
fObject As Object, _
NowPath As String, _
FileArray() As String, _
FileCount As Long, _
TempName As String, _
TempTime As Date, _
i As Long, _
j As Long, _
is_compositor As Boolean
List1.Clear
NowPath = App.Path
' 用 fso 查询路径得到指定路径下的文件
Set DriverObject = CreateObject("Scripting.FileSystemObject")
If DriverObject.FolderExists(NowPath) Then
Set FileObject = DriverObject.GetFolder(NowPath).Files
FileCount = FileObject.count
ReDim FileArray(FileCount - 1, 1)
i = 0
For Each fObject In FileObject
FileArray(i, 0) = fObject.Name
FileArray(i, 1) = fObject.DateLastModified
i = i + 1
Next
Set FileObject = Nothing
End If
If FileCount >= 1 Then
' 简单的冒泡法排序,效率很低,不过作为数据不多的文件处理够用了,最主要的是容易理解
For i = 0 To FileCount - 1
For j = 0 To FileCount - 1
If Len(FileArray(i, 0)) < Len(FileArray(j, 0)) Then
is_compositor = True
Else
If FileArray(i, 0) < FileArray(j, 0) Then
is_compositor = True
Else
is_compositor = False
End If
End If
If is_compositor Then
TempName = FileArray(j, 0)
TempTime = FileArray(j, 1)
FileArray(j, 0) = FileArray(i, 0)
FileArray(j, 1) = FileArray(i, 1)
FileArray(i, 0) = TempName
FileArray(i, 1) = TempTime
End If
Next
Next
For i = 0 To FileCount - 1
List1.AddItem FileArray(i, 0)
Next
End If
End Sub
我在3F说的,言中了吧!
--------------------编程问答-------------------- 类似楼主这样的问题,我在2006年给我的好友做的,用VBA处理Excel报表时就遇到了。
我就是根据需求,把它分成了3个类别,分别排序后输出。
但排序依据就复杂得多了,先根据分出的“类别”,再按“3到5个列”中的数据值,来决定哪个排在前、哪个排在后,这样才形成了一个规范、清晰的报表。
说实在的,她们之前用Excel的数据透视表弄出来的报表,我看着都烦。那个内容之乱哦……没话说
单说那个包含数值的字符串,楼主的仅是“一段”,我那个要处理的是分成3段的,并且第2、第3段分别再可以分为:1个数值,和用/隔开的两个数值 这两种(数值也是有整数和带小数点的数,当然这不算问题)。
正如SupermanKing说的那样,只要知道如何排序,再复杂的排序也不是问题。
--------------------编程问答-------------------- 还是我来说个简单的吧
直接把 .jpg 替换掉 然后转化为int 排序
截取的办法
select substring_index('www.sqlstudy.com.cn', '.', 1);
然后就是转化
好像是
str_to_int ('2')
忘了 百度一下吧
我的这个是mysql数据库 --------------------编程问答-------------------- 说个思路,
1、建立数组存入文件名
2、求最长文件名的长度N
3、用Format将文件名前边补0,然后排序
4、去除前边添加的0
补充:VB , 基础类