2014-06-29 59 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