質問

次のコードは、メッセージ ボックスに、 三番目 ある 文字列の中で チェックミー, 、しかし、プログラムを実行すると正しい答えが得られません(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

オプションの Explicit と Strict をオンにする必要があります。前もって感謝します。

役に立ちましたか?

解決

あなただけの第二の「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

他のヒント

私の何が間違っているのでしょうか?

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 試行するたびにすぐに終了すると、間違った結果が得られる可能性があります。

これを忘れた場合は (他の投稿にもあるようです)、3 番目を検索すると、 a 単一の文字列で 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

checkme.IndexOf("a") 2. 3を追加するので、式全体がなっ5.与えています

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

二番目のを見つけ、どのます。

はN番目の1、ループのN回、およびループラウンドごとの時間を見つけたい場合は行います:

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

ループ前に、なるようにPOSを設定-1。

あなたが持っているコードは、所望の効果をもたらすことはありません。何それが代わりにやっていることは2位である「」それは、5位(2 + 3)の後に発生した「」その最初の発見された最初の発見です。あなたが三分の一をしたい場合は、「」あなたは次の

のようなものを使用することができます
indexnum = checkme.IndexOf("a")
indexnum = checkme.IndexOf("a", indexnum+1)
indexnum = checkme.IndexOf("a", indexnum+1)

なぜそれが12でしょうか?

:「」、5位は、あなたのコード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

あなたは ""(ポジション2)第一をスキップして、第二の "a"(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 = -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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top