2016-10-14 6 views
0

私は、ユーザーが文章を入力して特定の単語の位置を検索できるコードを作成しました。文章を入力すると、最初にが発生したときに、各単語の位置が出力されます。位置の出力Visual Basic

Module Module1 
    Sub Main() 
     Dim WordNumber As Integer = 0 
     Dim StartofWord As Integer = 1 
     Dim Text As String = "" 
     Dim L As Integer = 0 
     Dim Word As String 

     Console.WriteLine("Enter your sentence ") 
     Dim LotsofText As String = UCase(Console.ReadLine) 

     Console.WriteLine("Enter your word") 
     Word = UCase(Console.ReadLine()) 

     'LotsofText= Console.ReadLine + " " 
     If Mid(LotsofText, Len(LotsofText) - 1, 1) <> " " Then LotsofText = LotsofText + " " 

     For L = 1 To LotsofText.Length 
      If (Mid(LotsofText, L, 1)) = " " Then 
       WordNumber = WordNumber + 1 
       Text = (Mid(LotsofText, StartofWord, L - StartofWord)) 
       'Console.WriteLine(Text) 
       StartofWord = L + 1 

       If Text = Word Then 
        Console.WriteLine(WordNumber) 
       End If 
      End If 
     Next 

     If Not Text = Word Then 
      Console.WriteLine("Error word not found") 
     End If 
     Console.Write("Press Enter to Exit") 
     Console.ReadLine() 
    End Sub 
End Module 
+0

単語とは何ですか?区切り文字で区切られた部分文字列や単語を探していますか(空白や句読点など)? –

+0

単語をスペースで区切って@TimSchmelter –

+0

単語の位置や文字の位置をお探しですか?すなわち「クイックブラウンキツネ」、「ブラウン」は2(ゼロベース)または10? – djv

答えて

1

オンボードの方法はなく、実際には単純ではありません。 1つのアプローチは、すべての文字を繰り返し、それが空間かどうかを調べることです。あなたが1つを見つけた場合は、連続するスペースがある可能性があるため、単語の先頭を見つける必要があります。そのインデックスを取得したら、次のスペースを探す必要があります。なぜなら、単語の終わりです。この単語があなたが探している単語に等しい場合、あなたはインデックスを持っています。

すべての一致インデックスまたは最後のインデックスを検索するなど、再利用できるメソッドを作成することは非常に難しいためです。したがって、イテレータはVB.NETにも存在します。彼らは物事をゆっくりと返すことができるので、あなたがそれらを求める場合に限ります。あなたが最初のを頼む場合の方法は、すぐに最初に戻されたように壊れます:ここで

Public Shared Iterator Function GetIndexesOfWord(input As String, wordToFind As String, Optional comparer As StringComparer = Nothing, Optional wordSeparator As Char = " "c) As IEnumerable(Of Int32) 
    If comparer Is Nothing Then comparer = StringComparer.Ordinal 
    For index As Int32 = 0 To input.Length - 1 
     If index = 0 OrElse input(index) = wordSeparator Then 
      Dim token = input.Substring(index) 
      Dim trimmed = token.TrimStart(wordSeparator) 
      index = index + (token.Length - trimmed.Length) ' start of word 
      Dim endIndex = input.IndexOf(wordSeparator, index) 
      If endIndex = -1 Then endIndex = input.Length 
      Dim length = endIndex - index 
      Dim word = input.Substring(index, length) 
      If comparer.Equals(word, wordToFind) Then 
       Yield index 
      End If 
      index = endIndex - 1 ' -1 because the for-loop will jump over the space otherwise 
     End If 
    Next 
End Function 

は例です:

Dim sentence = "this is just sample text that contains a text sample" 
Dim word = "sample" 
Dim indexes = GetIndexesOfWord(sentence, word) 

あなただけの最初のインデックスしたい場合:

Dim firstIndex As Int32 = indexes.First() 

すべてが必要な場合は、コレクションを記入することができます。たとえば、

Dim indexList As List(Of Int32) = indexes.ToList() 

リストを使用する場合は、lict.Count > 0を確認して、単語が文章内にあったかどうかを知ることができます。 FirstLast、または1つのインデックスを返す他のメソッドを使用する場合は、InvalidOperationExceptionになる可能性があります。この場合、のデフォルト値はInt32が有効なインデックスである0なので役に立ちません。だから、試合があったかどうかを判断するために、このアプローチを使用することができ、1つは最初のインデックスを取得していた場合:

Dim firstIndex As Int32 = indexes.DefaultIfEmpty(-1).First() 

は今、あなたは、単語がその文ではなかったことを意味することに-1を知っています。


あなたは、Visual Studio 2010を使用しているので、あなたはどのイテレータとVB.NETでYield -statement遅延実行を使用することはできません。最初に見つかったインデックスは、最初に必要な場合に効率的です。または、すべてのインデックスを含むリストを塗りつぶすこのメソッドを使用します。

Public Shared Function GetIndexesOfWord(input As String, wordToFind As String, Optional comparer As StringComparer = Nothing, Optional wordSeparator As Char = " "c) As IEnumerable(Of Int32) 
    If comparer Is Nothing Then comparer = StringComparer.Ordinal 

    Dim allIndexes = new List(Of Int32) 
    For index As Int32 = 0 To input.Length - 1 
     If index = 0 OrElse input(index) = wordSeparator Then 
      Dim token = input.Substring(index) 
      Dim trimmed = token.TrimStart(wordSeparator) 
      index = index + (token.Length - trimmed.Length) ' start of word 
      Dim endIndex = input.IndexOf(wordSeparator, index) 
      If endIndex = -1 Then endIndex = input.Length 
      Dim length = endIndex - index 
      Dim word = input.Substring(index, length) 
      If comparer.Equals(word, wordToFind) Then 
       allIndexes.Add(index) 
      End If 
      index = endIndex - 1 ' -1 because the for-loop will jump over the space otherwise 
     End If 
    Next 
    return allIndexes 
End Function 
+0

しかし、情報をありがとうございます。私はただの位置をすぐに出力したいと思っています –

+0

@AonNovas:すべての出力を出力したい場合、 'String.Join("、 "、indexes)' –

+0

コードを使用しようとすると、多数のエラーが表示されます。/ –