0

次のコードは、文字列checkmeの3番目 のaのインデックスをメッセージボックスに表示するはずですが、プログラムを実行すると、正しい答えが得られません(12である必要があり、代わりに9が表示されます)。私は何を間違っているのですか、そしてそれを機能させるにはどうすればよいですか?

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    Dim checkme As String = "thais is a sample sentence a"
    Dim indexnum As Integer
    indexnum = checkme.IndexOf("a", checkme.IndexOf("a") + 3)
    MessageBox.Show(CStr(indexnum))
End Sub

OptionExplicitおよびStrictはオンである必要があります。前もって感謝します。

4

6 に答える 6

2

私は何が間違っているのですか?

あなたは2番目を見つけていますa。私はあなたがこれについて考えていたと思います:

checkme.IndexOf("a", checkme.IndexOf("a", 3))

それは実際にあなたに正しい結果を与えるでしょう。(「3番目の文字(たまたまa)以降に発生する最初のaの後に発生する最初のaを見つける」と書かれています)

元のコードには、「最初のaの3つの位置以降に発生する最初のaを検索する」と記載されていましたが、これは2番目のaにのみ到達しますa

どうすれば修正できますか?

最後に見つかったインデックスを次の開始インデックスとして再利用して、ループ内でを使用することができます。IndexOf

Shared Public Function FindIndexOfNthChar(ByVal checkme as String, _
                                          ByVal checkChar as Char, _
                                          ByVal n as Integer) as Integer
   Dim lastIndex As Integer = -1

   For i As Integer = 1 To n
      lastIndex = checkme.IndexOf(checkChar, lastIndex + 1)
      If lastIndex = -1 Then Return -1
   Next i

   Return lastIndex
End Function

あなたは注意する必要があります; すべての試行をチェックせず-1にすぐに終了すると、間違った結果になる可能性があります。

これを忘れた場合(他の投稿のいくつかが持っているようです)、a単一の文字列で3番目を検索すると、a実際には最初のインデックスが返さaれます(2番目のaを見つけようとすると、インデックスをにリセットします-1。これにより、基本的に検索が最初からやり直されます)

そのため、あなたが何を意味するのかを正確に書く方がより明確かもしれません。

Shared Public Function FindIndexOfNthChar(ByVal checkme as String, _
                                   ByVal checkChar as Char, _ 
                                   ByVal n as Integer) as Integer
   Dim count as Integer = 0

   For i as Integer = 0 To checkme.Length - 1
      If(checkme(i) = checkChar) Then
         count += 1
         If(count = n) Then Return i 
      End If
   Next i

   return -1
End Function
于 2009-03-21T23:54:05.810 に答える
1

checkme.IndexOf("a")は2です。3を追加すると5になります。したがって、式全体は次のようになります。

indexnum = checkme.IndexOf("a", 5)

これは2番目のものを見つけます。

N番目のものを見つけたい場合は、N回ループし、ループを一周するたびに次のようにします。

pos = checkme.IndexOf('a', pos + 1)

ループの前に、posを-1に設定します。

于 2009-03-21T23:48:33.920 に答える
1

あなたは2番目の「a」を見つけているだけです。そのようなループを使用してみてください。

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    Dim checkme As String = "thais is a sample sentence a"
    Dim indexnum As Integer = -1
    For i As Integer = 1 To 3
        indexnum = checkme.IndexOf("a", indexnum + 1)
    Next
    MessageBox.Show(CStr(indexnum))
End Sub
于 2009-03-21T23:50:15.053 に答える
0

あなたが持っているコードは、望ましい効果を生み出しません。代わりに、位置2にある最初の「a」を見つけます。次に、位置5(2 + 3)の後に発生する最初の「a」を見つけます。3番目の「a」が必要な場合は、次のようなものを使用できます

indexnum = checkme.IndexOf("a")
indexnum = checkme.IndexOf("a", indexnum+1)
indexnum = checkme.IndexOf("a", indexnum+1)
于 2009-03-21T23:50:18.457 に答える
0

なぜ12になるのでしょうか。位置5の次の「a」は位置9にあります。コードは基本的に次のように分類されます。

'thais is a sample...
'0123456789
Dim idxFirstA = checkme.IndexOf("a") ' equals 2

'thais is a sample...
'0123456789
Dim idxThirdA = checkme.IndexOf("a", 2 + 3) ' equals 9

最初の「a」(位置2)をスキップして、2番目の「a」(位置9)を見つけます。

于 2009-03-21T23:51:49.607 に答える
0
Private Sub Button4_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) _
                          Handles Button4.Click
    Dim checkme As String = "thais is a sample sentence a"
    Dim indexnum As Integer = -1, occrnc As Integer = 0
    For x As Integer = 0 To checkme.Length - 1
        indexnum = checkme.IndexOf("a", indexnum + 1)
        If indexnum <> -1 Then occrnc += 1
        If occrnc = 3 Then Exit For
    Next
    If occrnc = 3 Then MessageBox.Show(indexnum.ToString)
End Sub
于 2009-03-22T00:11:46.860 に答える