对多维数组进行排序并显示它

时间:2014-06-29 09:41:50

标签: sorting multidimensional-array asp-classic

这是我的代码的一部分。

<%
Dim lineData,fso,filea,fileb,filec
s=request.querystring("query")

set fso = Server.CreateObject("Scripting.FileSystemObject") 

a(0,0)=0
a(1,0)=" - Entries in File A"
set filea = fso.OpenTextFile(Server.MapPath("FileA.txt"), 1, true)
do until lone.AtEndOfStream
    lineData = lcase(filea.ReadLine())
    if instr(lineData,s)>0 then
    a(0,0)=a(0,0)+1
    end if
Loop

a(0,1)=0
a(1,1)=" - Entries in File B"
set fileb = fso.OpenTextFile(Server.MapPath("FileB.txt"), 1, true)
do until mile.AtEndOfStream
    lineData = lcase(fileb.ReadLine())
    if instr(lineData,s)>0 then
    a(0,1)=a(0,1)+1
    end if
Loop


a(0,2)=0
a(1,2)=" - Entries in File C"
set filec = fso.OpenTextFile(Server.MapPath("FileC.txt"), 1, true)
do until payne.AtEndOfStream
    lineData = lcase(filec.ReadLine())
    if instr(lineData,s)>0 then
    a(0,2)=a(0,2)+1
    end if
Loop
%>

代码主要查找文本文件中的条目数。我需要的是对它进行排序,使得具有最多条目数的文件首先出现。

假设FileA中有10个条目,FileB中有12个条目,FileC中有7个条目。我希望输出显示如下:

12 - Entries in File B
10 - Entries in File A
7 - Entries in File C

我猜它不会太复杂,因为response.write(a(0,i)&amp; a(1,i))会起作用。我只需要循环或任何排序方法的帮助,如果有的话。 我非常感谢能得到的任何帮助。

3 个答案:

答案 0 :(得分:0)

这将是一个“新答案”,可以帮助您在短期和长期内到达您想去的地方。

1)首先,建议进一步阅读以帮助您以更一般的方式解决此类问题 - 并帮助您随时开发“排骨”。你可以谷歌使用术语“冒泡排序”并获得大量有趣且最有帮助的输入,但这里有一个你可能会发现最直接帮助的链接,来自Rolla网站的4个人排序的简短系列文章,在当天回到ASP的质量写作的地方:

http://www.4guysfromrolla.com/webtech/011601-1.shtml

你会看到有一个介绍文章顶部的介绍性文章的链接,涵盖了一维数组排序,我也推荐它。首先,它引入了另一种排序方法QuickSort,并且在工具箱中拥有多个工具几乎绝不是一个坏主意。 (正如您将发现的那样,冒泡排序通常是最容易设想和实现的,但由于其性能基本上是基于排序项目的线性,因此可能会成为较大数据集的性能问题。)来吧,检查出来;我会等你回来......

2)好的,为了给你一个更具体的方法来解决你的具体情况,如果你正在审查的文件数量不会太大,你可以做一种“最终通过”排序按所需顺序显示结果。

首先,您需要在代码顶部引入一个简单的全局计数变量:

dim intMaxEntries
intMaxEntries = 0

然后,在每次文件解析运行结束时,您将要检查针对intMaxEntries的条目数,并在刚读入的条目数更大时更新intMaxEntries。

if a(0, 1) > intMaxEntries then
    intMaxEntries = a(0, 1)
end if

您将在每个文件读取循环后立即执行,因此上述代码段中的比较将针对(0,1),a(1,1)和a(2,1)进行。更多关于最后的重复逻辑。

完成所有文件读取后,intMaxEntries将拥有您在其中一个文件中找到的最大条目数。然后,您可以从该值中退出,并在与倒计时匹配时以正确的顺序打印输入计数:

dim i, j
for i = intMaxEntries to 0 step -1
    for j = 0 to ubound(a)         'By default gives the upper bound of the 1st dimen.
        if a(j, 1) = i then
            Response.Write i & a(j, 2) & "<BR>"
        end if
    next j
next i

这不仅仅是一个黑客攻击,而且我鼓励你选择改造你的阵列,以便你有一些更普遍有用的东西,但它会让你到达你想去的地方,特别是如果文件数 - 或最大条目数 - 不是太大。您还可以通过引入在考虑所有文件时突破循环的可能性来清理我的示例,但我会让您弄清楚是否有必要。

3)你可能刚刚简化了代码库,以便更清晰地理解这个概念(如果是真的,我会为此鼓掌),但为了以防万一,我建议您通过构建文件来了解模块化工作的方法读取功能作为一个函数,只需使用所需的文件和字符串比较信息调用。 (另外,可能是你剪切的神器,但是那里的“孤独”,“英里”和“佩恩”参考没有意义;假设那些是您实例化的FSO并且忘记将它们更改为fileA, fileB和fileC。)

希望有所帮助,

布雷特

答案 1 :(得分:0)

@bret 其他人过来了。 这是一个完美运作的代码。 这会是&#34;冒泡排序&#34;?

的一个例子
for k=23 to 0 Step-1
    for j=0 to k
        if (a(0,j)<a(0,j+1)) then
            t1=a(0,j+1)
            t2=a(1,j+1)
            a(0,j+1)=a(0,j)
            a(1,j+1)=a(1,j)
            a(0,j)=t1
            a(1,j)=t2
        end If
    next
next
for i=0 to 24
    if a(0,i)>0 then
        response.write (a(0,i)&a(1,i)&"<br>")
    end if
next

答案 2 :(得分:0)

set objFSO = Server.CreateObject("Scripting.FileSystemObject")
set objFolder = objFSO.GetFolder(server.mappath("Files"))
set objfiles = objFolder.Files

Function filesearch(name)

set searchname = objFSO.OpenTextFile(server.mappath(filename),1, true)
do until searchname.AtEndOfStream
lineData = lcase(searchname.ReadLine())
if instr(lineData,s)>0 then
instances = instances + 1
end if
Loop

End Function

For Each objFile in objFolder.Files
filesearch(objFile)
Response.Write filename & "<br>" & instances & "<br>" & "<br>"
Next

Set objFolder = Nothing
Set objFSO = Nothing

有一些粗糙的边缘,但现在真正困扰我的是排序。我在哪里保留冒泡排序代码?

编辑: 我已经通过以下代码完美地完成了工作。

For Each objFile in objFolder.Files
filesearch(objFile)
i = i + 1
a(0,i) = instances
a(1,i) = filename
Next

我还想知道无论如何我还可以写出实例总数。之前我能够做到:

for i=0 to 43
    entries=entries+a(0,i)
next

我似乎无法让它现在发挥作用。

编辑: 现在可以使用:

for i = 0 to n
entries = entries + a(0,i)
next