【问题标题】:Method to determine index of parent loop when child loop matches condition子循环匹配条件时确定父循环索引的方法
【发布时间】:2012-11-30 18:34:08
【问题描述】:

编辑:正如 Damien_The_Unbeliever 所说,为了使问题更容易理解,最终结果是尝试“在序列中搜索子序列”。在colorList内从colorsToFind中找到Blue,Yellow,Green的序列

是否有人有一些指针来确定嵌套 for 循环的最佳方法,其中内部循环需要确定父循环中是否包含字符串序列?

因此,对于下面的示例,由于在索引 [5]​​、[6]、[7] 处可以找到“Blue”、“Yellow”、“Green”,因此我想返回这些索引。或者至少是 [5] 的第一个找到的索引。

我认为问题与 for (int j 循环如何在找到的索引上爆发有关。

string[] colorList = "Royal Blue", "Tomato Red", "Mustard Yellow", "Midnight Blue", "Blue", "Blue", "Yellow", "Green", "Red", "Evergreen", "Purple", "Black", "Jet Black";

string name = "Blue,Yellow,Green";

string[] colorsToFind = name.Split(',');
int found = 0;

for (int i = 0; i < colorList.Count -1; i++)
{
    for (int j = 0; j < colorsToFind.Count; j++)
    {
        if (colorList[i] == colorsToFind[j])
        {
            found = i;
            break;
        }
    }
}

if(found != 0)
{
    return found;
}

return null;

【问题讨论】:

  • 此外,如果发现它们,您没有捕获数组中我发现 = true 的所有索引位置。您可以将找到的值添加到内部循环中的 List 或 List ..
  • 那么,更清晰的表述方式可能是您想在序列中搜索子序列? (大概,没有任何中间不匹配的元素,但从你的例子中并不清楚。
  • @Damien_The_Unbeliever 这就是我要找的。我会编辑这个问题。谢谢。

标签: c# .net for-loop nested-loops


【解决方案1】:
string[] colorList = {"Royal Blue", "Tomato Red", "Mustard Yellow", "Midnight Blue", "Blue", "Blue", "Yellow", "Green", "Red", "Evergreen", "Purple", "Black", "Jet Black"};
string[] colorsToFind = "Blue,Yellow,Green".Split(',');

for (int i = 0; i < colorList.Length - colorsToFind.Length; i++)
{
    int j;  // we'll need this later
    for (j = 0; j < colorsToFind.Length; j++)
    {
        if (colorList[j + i] != colorsToFind[j])
        {
            break;  // stop if it doesn't match
        }
    }

    // j for-loop was exited because j == colorsToFind.Length so a set matched
    if (j == colorsToFind.Length)
    {
        Console.WriteLine(i);
        break;
    }
}

【讨论】:

  • 感谢您的帮助。我觉得这是关键if (colorList[j + i]
【解决方案2】:

当您的意思是比较发生时,您正在测试相等性。

if (colorList[i].indexOf(colorsToFind[j]) != -1)
{
    found = i;
    break;
}

【讨论】:

  • 我认为这类似于我为 Dave Zych 留下的评论,因为 indexOf 会在 Royal Blue 中找到 Blue,这将被视为误报
【解决方案3】:
for (int i = 0; i < colorList.Count -3; i++)
{
     if (colorList[i] == colorsToFind[0] && 
         colorList[i+1] == colorsToFind[1] && 
         colorList[i+2] == colorsToFind[2])
     {
            found = i;
            break;
     }
}

for (int i = 0; i < colorList.Count - colorsToFind.count; i++)
{
    for (int j = 0; j < colorsToFind.Count; j++)
    {
        bool match = true;
        if (colorList[i+j] != colorsToFind[j])
        {
            match = false;
        }  
    }
    if (match) 
    {   
        found = i;
        break;
    }
}

【讨论】:

  • 现在想想如果colorsToFind 添加Red 会发生什么:/
  • @jmfsg 那我想你会在此基础上再接再厉。
猜你喜欢
  • 1970-01-01
  • 2016-02-23
  • 2015-10-30
  • 1970-01-01
  • 2013-02-07
  • 2020-03-27
  • 2020-10-06
  • 1970-01-01
  • 2020-06-02
相关资源
最近更新 更多