【问题标题】:Finding an int value within multidimensional array?在多维数组中找到一个 int 值?
【发布时间】:2013-11-12 08:27:53
【问题描述】:

如果有人能指出我正确的方向,我将不胜感激。在过去的几个月里,我一直在使用 Murach 的 C# 2013 书学习 C#,这是一本好书,但有时它缺乏某些细节。我一直在使用数组,最后开始使用多维数组,我编写了一个简单的逻辑,其中使用嵌套的“For Loop”将多维数组声明并填充为(4x4)乘法表,该表按预期工作。问题是我现在正在尝试通过使用嵌套的“For Loop”在二维数组中搜索给定的 int 值,并且我想通过遍历所有行和列并获取它的位置来找到 int 值使用数组索引。我已经在这几天了,我在网上搜索但无法找到一个可靠的方向。

目标:一旦乘法表被填充,现在我想在所有列和行中定位“9”。

如果有人能让我继续使用它,那就太棒了。这是我的代码。

//CONSTANT ARRAY LENGTH
const int multiTable = 4;

//ARRAY
int [ , ] multiplicationTableArr = 
      new int[multiTable, multiTable];  // 4 x 4 table 

//MULTIPLICATION METHOD
private void MultiplicationTable
{
    int r; //ROW
    int c; //COLUMN
    int result;

    for (r = 0; r < multiplicationTableArr.GetUpperBound(0); r++)
    {
        //NESTED FOR LOOP
        for (c = 0; c < multiplicationTableArr.GetUpperBound(0); c++)
        {
            result = (r + 1) * (c + 1); 
            multiplicationTableArr[r, c] = result; 
            break;
        }//NESTED FOR LOOP ENDS
    }
}

// SEACHFORVALUE METHOD
private void seachForValue()
{
    int r; //ROW
    int c; //COLUMN
    int intSearchNumber;

    txtTable.Clear(); //clear the text box

    intSearchNumber = int.Parse(txtSearchNumber.Text); 

    for (r = 0; r < multiplicationTableArr.GetLength(0); r++)
    {
        for (c = 0; c < multiplicationTableArr.GetLength(1); c++)
        {
            if (intSearchNumber == multiplicationTableArr[r,c])
            {
                txtTable.AppendText(r + ", " + c.ToString());
            }
        }//NESTED FOR LOOP ENDS
    }
}

谢谢。

【问题讨论】:

  • 什么不起作用?它会在文本框中显示一些结果吗?
  • 我意识到 4x4 不是大桌子,所以我现在将它增加到 12x12。我能够找到 10 以下的任何值,并且我当前的逻辑在表中显示该值一次。所以假设我搜索 12,我知道 12 不止出现一次,但我的逻辑只显示它,好像它只在行和列中出现一次。谢谢。

标签: c# multidimensional-array


【解决方案1】:

我不满意的一件事是对行和列都使用GetUpperBound(0),因为你很幸运它们都是 4。如果它们的大小不同,你的代码就会失败。

话虽如此,请使用rowcolumn 而不是rc

该代码似乎应该可以工作...在txtTable.AppendText... 中设置一个断点,看看您的问题是与输出有关,还是与逻辑有关。

编辑:这确实是上面的答案,我的变量名称和输出更改
不要因为它是正确的答案而投票,因为你应该投票给上面的答案。

为便于阅读/更好地使用变量名和更清晰的输出结果而进行了编辑:

internal class Program
{
    public static void Main(string[] args)
    {
        var test = new ConsoleTest();
        var v = test.seachForValue(12);
        Console.WriteLine(v);


        Console.ReadLine();
    }
}

public class ConsoleTest
{
    public ConsoleTest()
    {
        MultiplicationTable();
    }

    //CONSTANT ARRAY LENGTH
    public const int TableSize = 12;
    //ARRAY
    public int[,] multiplicationTableArr = new int[TableSize, TableSize];  


    //MULTIPLICATION METHOD
    // this will intialize your array to your multiplication table 
    private void MultiplicationTable()
    {
        for (int row = 0; row < TableSize; row++)
        {
            //NESTED FOR LOOP
            for (int column = 0; column < TableSize; column++)
            {
                multiplicationTableArr[row, column] = (row + 1) * (column + 1);
            }//NESTED FOR LOOP ENDS
        }
    }

    // SEACHFORVALUE METHOD
    public string seachForValue(int intSearchNumber)
    {
        var result = new StringBuilder();

        for (int row = 0; row < TableSize; row++)
        {
            for (int col = 0; col < TableSize; col++)
            {
                if (intSearchNumber == multiplicationTableArr[row, col])
                {
                    result.AppendLine("(" + row + ", " + col + ") -> " + (row + 1) + "*" + (col + 1 )+ "=" + intSearchNumber);
                }
            }//NESTED FOR LOOP ENDS
        }

        return result.ToString();
    }
}

【讨论】:

  • 这更像是一个评论而不是一个答案。您不建议任何修复,而只提供评论 cmets
  • 第二个维度,列循环,可以使用GetUpperBound(1)
  • 感谢大家的所有意见。 @Noctis,非常感谢您为我指明了正确的方向。现在一切都变得有意义,并且按预期工作。
【解决方案2】:

代码有几个问题:

  1. MultiplicationTable 必须是一个方法 - 没有签名就无法编译
  2. 您需要去掉内部循环中的“中断” - 这将阻止它正常运行 - 它会在第一次通过后中断。
  3. 在您的 searchForValue 方法中,您可以使用 multiTable 作为表维度,而不是 multiplicationTableArr.GetLength,因为它已经定义了。如果您确实使用了 multiplicationTableArr.GetLength,请确保加 1,否则它将在最后一行/列之前停止。
  4. 您实际上需要调用 MultiplicationTable 来填充表格。您可以从类构造函数中执行此操作。

这是您的代码的控制台应用程序版本,上面应用了更正。

搜索9,输出为:

2, 2

代码是:

using System;

namespace MultiplyTest
{
    public class ConsoleTest
    {
        //CONSTANT ARRAY LENGTH
        public const int multiTable = 4;
        //ARRAY
        public int[,] multiplicationTableArr = new int[multiTable, multiTable];  // 4 x 4 table 

        public ConsoleTest()
        {
            MultiplicationTable();
        }

        //MULTIPLICATION METHOD
        private void MultiplicationTable()
        {
            for (int r = 0; r < multiTable; r++)
            {
                //NESTED FOR LOOP
                for (int c = 0; c < multiTable; c++)
                {
                    multiplicationTableArr[r, c] = (r + 1) * (c + 1);
                }//NESTED FOR LOOP ENDS
            }
        }

        // SEACHFORVALUE METHOD
        public string seachForValue(int intSearchNumber)
        {
            var result = string.Empty;

            for (int r = 0; r < multiTable; r++)
            {
                for (int c = 0; c < multiTable; c++)
                {
                    if (intSearchNumber == multiplicationTableArr[r, c])
                    {
                        result = result + r + ", " + c;
                    }
                }//NESTED FOR LOOP ENDS
            }

            return result;
        }
    }

    internal class Program
    {
        public static void Main(string[] args)
        {
            var test = new ConsoleTest();
            Console.WriteLine(test.seachForValue(9));
        }
    }
}

【讨论】:

  • 在他的 12x12 上运行代码并查找 12 会返回此数组: (0, 11) (1, 5) (2, 3) (3, 2) (5, 1) (11, 0)
  • 这似乎是正确的!这些单元格对应于 1 x 12、2 x 6、3 x 4、4 x 3、6 x 2 和 12 x 1。所有这些都等于 12。
  • 这是正确的:)。我刚刚添加了输出,因为他将他的问题从 4 更新为 12。我对其进行了一些更改(变量名称),并添加到我的答案中(带有一个大的 IT'S NOT ORIGINAL 粗体标题......)希望你没问题.. .
  • @Noctis:当然! :) 不确定你也想粘贴洗牌代码? ;)
  • Argh ...是的,是的...来自不同的答案...删除它...我的错:)
猜你喜欢
  • 1970-01-01
  • 2011-11-19
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多