2014-06-29 55 views
0

这是我的代码的一部分。排序多维数组并显示它

<% 
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,1))将工作。如果有的话,我只需要帮助循环或任何排序方法。 任何帮助,我可以在这里将非常感激。

回答

0

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

1)首先,提供进一步阅读的建议,以帮助您以更一般的方式解决这类问题 - 并帮助您随时发展您的“印章”。您可以在谷歌术语“冒泡排序”中获得一系列有趣且最有帮助的输入内容,但是您可能会从中找到最直接有用的链接,这些链接来自罗拉网站的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)和(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)您可能已简化了代码库,以便更清楚地理解概念(为此我鼓掌称赞,如果属实的话),但为了以防万一,我会鼓励您通过构建您的模块来模块化您的工作文件读取功能作为一个函数,只需使用所需的文件和字符串比较信息调用。 (另外,可能是剪切的人为因素,但那里的“孤独”,“里程”和“佩恩”引用没有意义;假设这些是您正在实例化并已忘记将其更改为fileA的FSO, FILEB和fileC。)

希望有点帮助,

布雷特

+0

这有很大帮助,实际上是: 现在的作品。 关于最后一部分,我如何“通过将文件读取功能构建为只需使用所需文件和字符串比较信息调用的函数来模块化您的工作”? 是的,我忘了把这些名字改成fileA,fileB和fileC。 该程序旨在查看电影字幕的搜索字词。 (孤独,英里和payne是我分配给“独行侠”,“8英里”和“Max Payne”的变量。 在附注中,我对ASP很新,想知道如何发布此网站。或者只有在ASP.NET中才有可能? – user3782707

+0

最后一个问题:你肯定可以发布这个站点,IIS(微软的web服务器)将很容易地处理ASP - 我可以在我的本地机器上运行它(Windows)。您可以使用一个教程作为起点:http://www.iis。net/learn/application-frameworks/running-classic-asp-applications-on-iis-7-and-iis-8/scenario-build-a-classic-asp-website-on-iis – Bret

+0

关于你的第一个问题,那就是一个较长的答案,将需要您的一些工作,但让我回答一个问题: 你有24块基本上阅读你正在使用的每个字幕文件的代码?定义一个单独的函数并简单地调用它24次是否有意义? (如果你做一些额外的工作,让你的应用程序扫描目标目录并解析它找到的每个字幕文件,而不必设置硬连线数字,那么是不是更有意义?) – Bret

0

@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 
+0

它是,也是我提出的有关特定与广义/模块化代码的问题的一个示例,具体为:为什么您有23/24硬连线到上面的算法?我明白他们代表的是什么,但问题是,让你的代码库更加灵活不是更好吗?如果您决定要为搜索添加更多电影,该怎么办?如果你做得对,你只需将文件添加到相关的目录中,你的代码就可以在不修改的情况下处理新文件。 – Bret

+0

所以不是 对于k = 23至0步骤-1 ,你可以有: 对于k =(UBOUND(一) - 1)为0 -1步骤 等等。这个想法是让您的应用程序尽可能高效而不会变得脆弱。添加文件或更改搜索内容或类似的更改应该可以通过无需或只需极少的返工来完成。 – Bret

+0

P.S.很高兴你能立即解决问题,并希望我能帮助我们弄清楚如何使它更健壮。 干杯, Bret – Bret

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