2012-08-02 29 views
0

我被指示我將創建一個索引。根據用戶輸入的文本創建一個「索引」報告 - VB 2010

基本上,用戶應該能夠在空的文本框中對某些文本進行糾正。點擊一個按鈕後,輸出結果將顯示一個按字母順序排列的輸入單詞列表,以及它們出現的行號。

因此,例如:

一條魚
兩條魚
紅色的魚
藍色的魚。

黑魚
藍色的魚
老魚
新的魚類。

這一個有
一個小星星。

這人有一輛小車。說吧!有什麼很多的魚有。

A 12,14,15
BLACK 6
BLUE 4,7
CAR 14
FISH 1,2,3,4,
HAS 11,14
LITTLE 12, 14
LOT 15
NEW 9
第16
OLD 8
ONE 1,11,14
RED 3
SAY 15
STAR 12
THERE 16
THIS 11,14
TWO 2
WHAT 15

本文是參照使用從Java文檔用於創建索引和我遵循它,期望與我的一樣,只是用另一種語言。

我正在紙上工作,算出一個算法,但我對我的努力感到有點沮喪!

一對夫婦的更多的要求:

的行號的最大量出現是4,從而即使在10條不同的線出現一個字,它應該只標記爲4倍

語法必須如此忽略包含!的詞,?必須拆除 詞被拼寫:你好必須拼寫:你好

謝謝你在先進的幫助

+2

到目前爲止,你有嘗試過什麼嗎? – 2012-08-02 20:40:16

+0

嗨喬瓦尼,沒有不只是,我正在考慮算法,我來到這裏想從哪裏開始,並幫助徹底思考問題 – AdamWest 2012-08-03 18:46:16

回答

1

如果你需要顯示的新詞在其中,他們出現在文本文件中的順序,然後改變從HashTable到SortedList。

Dim hshResults As New Hashtable() 

    Dim lstLinesOfText As List(Of String) = IO.File.ReadAllLines("C:\YourFile.txt").ToList() 

    Dim intLineCursor As Integer = 0 

    For Each strLine As String In lstLinesOfText 

     Dim lstWords As List(Of String) = strLine.Split(" ").ToList() 

     For Each strWord As String In lstWords 

      ProcessWord(strWord, hshResults, intLineCursor) 

     Next 

     intLineCursor += 1 

    Next 

    Dim strOutput As String = String.Empty 

    For Each o As DictionaryEntry In hshResults 

     strOutput += CStr(o.Key) & " " 

     Dim lstLinesWhereWordIsFount As List(Of Integer) = CType(o.Value, List(Of Integer)) 

     For Each i As Integer In lstLinesWhereWordIsFount 

      strOutput += CStr(i) & " " 

     Next 

     'Some cleanup of extra spaces. 
     strOutput = Trim(strOutput) & ControlChars.NewLine 

    Next 

Private Sub ProcessWord(ByVal strWord As String, ByRef hshResults As Hashtable, ByVal intLineIndex As Integer) 

    Dim lstLinesWhereWordIsFound As List(Of Integer) = (From o As DictionaryEntry In hshResults _ 
                 Where CStr(o.Key) = strWord _ 
                 Select CType(o.Value, List(Of Integer))).FirstOrDefault() 

    If lstLinesWhereWordIsFound Is Nothing Then 

     'Add this word. 
     Dim lstNewHashTableValue As New List(Of Integer) 
     lstNewHashTableValue.Add(intLineIndex + 1) 'Indexes in the programming world start at 0. 

     hshResults.Add(CObj(strWord), CObj(lstNewHashTableValue)) 

    Else 

     'Add the line number for this word. 
     If lstLinesWhereWordIsFound.Count < 5 Then 

      'Make sure we're not duplicating a line number for this word. 
      If (From i As Integer In lstLinesWhereWordIsFound _ 
       Where i = intLineIndex).Count = 0 Then 

       lstLinesWhereWordIsFound.Add(intLineIndex + 1) 

       hshResults(strWord) = CObj(lstLinesWhereWordIsFound) 

      End If 

     End If 

    End If 

End Sub 

編輯:代碼

首先交代,我實例化一個哈希表來存儲的話和他們被發現的行。然後,我將文本文件的每一行都放入List(String)對象中。遍歷文本文件的行,我使用Split方法將行的每個單詞變爲另一個List(String)變量。我通過一個方法(ProcessWord)發送該行的每個單詞,以適當地更新HashTable。最後,我遍歷HashTable中的所有鍵/值對以生成所需的輸出。 ProcessWord方法的邏輯首先確定該單詞是否已經存在於HashTable中。如果沒有,請添加單詞和行號。如果是,請確保行數不超過4的頻率(根據您的問題要求),確保它不會將相同的行號放置兩次(萬一一個單詞在同一行中是多行次),如果滿足所有這些條件,則添加行號,然後更新HashTable。

+0

嗨,我真的很感謝你的回答,有沒有什麼辦法可以擴展代碼來解釋它做什麼?我理解它的部分內容,但是我的編程知識並不好,因爲我還在學習!謝謝 – AdamWest 2012-08-03 18:48:52

+0

我編輯了我的答案,以便更具描述性。 – N0Alias 2012-08-03 20:35:40

+0

非常感謝您的幫助,我會努力實現它,明天回覆您,歡呼! – AdamWest 2012-08-03 21:02:45

相關問題