这是我的部分代码。
<%
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
我猜这不会太复杂,因为回应。写(a(0,I(&a(1,i((将起作用。我只需要帮助循环或任何排序方法(如果有的话(。我在这里能得到的任何帮助都将不胜感激。
这将是一个"新答案",可以帮助你在短期和长期内达到你想要的目标。
1( 首先,一个进一步阅读的建议,可以帮助你以更普遍的方式解决这类问题,并帮助你在前进的过程中发展自己的"能力"。你可以在谷歌上搜索"冒泡排序"一词,并获得大量有趣且最有用的输入,但这里有一个链接,你可能会发现它最直接有用,它来自Rolla网站的4 Guys关于排序的一系列简短文章,当时该网站是ASP:上高质量写作的地方
https://web.archive.org/web/20211020153403/https://www.4guysfromrolla.com/webtech/011601-1.shtml
您会看到,在这篇文章的顶部有一个链接,链接到一篇介绍一维数组排序的文章,我也推荐它。首先,它引入了另一种排序方法QuickSort,在工具箱中拥有多个工具几乎从来都不是一个坏主意。(正如你会发现的,气泡排序通常是最容易设想和实现的,但由于其性能基本上是基于排序的项目数量的线性,因此在较大的数据集上可能会成为性能问题。(继续吧,看看吧;我会等你回来。。。
2( 好吧,为了给你一个更具体的方法来解决你的具体情况,如果你正在审查的文件数量不会太多,你可以做一种"最终通过"排序,以所需的顺序显示你的结果。
首先,您需要在代码顶部引入一个简单的全局计数变量:
dim intMaxEntries
intMaxEntries = 0
然后,在每次文件解析运行结束时,您需要对照intMaxEntries检查条目数量,如果刚读入的条目数量更大,则更新intMaxEntrys。
if a(0, 1) > intMaxEntries then
intMaxEntries = a(0, 1)
end if
您将在每个文件读取循环之后立即执行,因此上面片段中的比较将针对a(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( 你可能只是简化了代码库,以便更清晰地理解这个概念(如果这是真的,我会为你鼓掌(,但为了以防万一,我鼓励你考虑如何通过将文件读取功能构建为一个函数来模块化你的工作,该函数只需使用所需的文件和字符串比较信息即可调用。(此外,这可能是你狙击的产物,但其中的"lone"、"mile"one_answers"Payne"引用没有意义;假设这些是你正在实例化的FSO,并且刚刚忘记将它们更改为fileA、fileB和fileC。(
希望这能有所帮助,
Bret
@bret其他人过来了。这是一个运行良好的代码。这会是"泡沫排序"的一个例子吗?
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
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