我想编写一个程序来查找一个关键字被重复多少次(即“ the”),然后将索引位置存储在一个数组中。目前,我的代码只存储第一次在字符串语句中读取“ the”的地方。您如何使其在第一次读取“ the”和第二次读取时存储索引位置?
它在控制台上输出:
11
0
我当前的代码:
string sentence = "John likes the snow and the winter.";
string keyWord = "the";
var test = sentence.Split(new char[] { ' ', '.' });
var count = Array.FindAll(test, s => s.Equals(keyWord.Trim())).Length;
int[] arr = new int[count];
for (int i = 0; i < arr.Length; i++)
{
arr[i] = sentence.IndexOf("the", i);
i++;
}
foreach (int num in arr)
{
Console.WriteLine(num);
}
Console.ReadLine();
答案 0 :(得分:0)
第二个结果(0
)在那里,因为for循环中不必要的i++
。因此,您只进入循环一次。要实现所需的功能,您可以尝试下面的代码(请仔细查看for循环的正文:
string sentence = "John likes the snow and the winter.";
string keyWord = "the";
var test = sentence.Split(new char[] { ' ', '.' });
var count = Array.FindAll(test, s => s.Equals(keyWord.Trim())).Length;
int[] arr = new int[count];
int lastIndex = 0;
for (int i = 0; i < arr.Length; i++)
{
lastIndex = sentence.IndexOf("the", lastIndex + keyWord.Length); //We are adding length of the `keyWord`, because we want to skip word we already found.
arr[i] = lastIndex;
}
foreach (int num in arr)
{
Console.WriteLine(num);
}
Console.ReadLine();
我希望这是有道理的。
答案 1 :(得分:0)
我在您的代码中看到两个问题。首先,您将i
递增两次,因此它只会得到一半的项目。其次,将i
作为第二个参数传递给IndexOf
(代表搜索的起始索引)。相反,您应该通过传入找到的最后一个实例的索引及其长度来开始搜索之前找到的实例。
这是for
循环的固定示例:
for (int i = 0; i < arr.Length; i++)
{
arr[i] = sentence.IndexOf(keyword, i == 0 ? 0 : arr[i - 1] + keyword.Length);
}
此外,如果您使用List<int>
而不是int[]
来存储索引,则可以简化代码,因为使用List
时,您不需要知道计数提前
string sentence = "John likes the snow and the winter.";
string keyWord = "the";
var indexes = new List<int>();
var index = 0;
while (true)
{
index = sentence.IndexOf(keyWord, index); // Find the next index of the keyword
if (index < 0) break; // If we didn't find it, exit the loop
indexes.Add(index++); // Otherwise, add the index to our list
}
foreach (int num in indexes)
{
Console.WriteLine(num);
}