【问题标题】:C# 2D Array calling it another class through obj.method();C# 2D Array 通过 obj.method() 调用另一个类;
【发布时间】:2015-09-19 08:53:36
【问题描述】:

编写一个 Java 类,该类具有一个名为 count 的静态方法,该方法接受一个二维整数数组和一个目标整数值作为参数,并返回目标值在数组中出现的次数。例如,如果一个名为 list 的变量引用了一个包含值 {{3,5,7,94}{5,6,3,50}} 的数组,那么对 count(list, 3) 的调用应该返回 2,因为数组中出现了 2 次值 3。

这是我的编码,它没有给我正确的输出 P.S :-我被告知将计数方法作为公共而不是静态的

class java
{
    public int count(int [,] list,int n)
    {
        int c = 0;
        for (int i = 0; i <list.Length; i++)
        {
            for (int j = 0; j < list.Length; j++)
            {
                if (list[i, j] == n)
                {
                    c++;
                }
            }
        }
        return c;
    }

class Program
{
    static void Main(string[] args)
    {
        java jv = new java();
        int[,] arr = { { 3, 5, 7, 94 }, {5, 6, 3, 50 } };
        int k=0;
        jv.count(arr,k);
    }
}

【问题讨论】:

  • 你调试了吗?
  • 是的,我尝试调试它。在 if(list[i,j]==n) 它说索引超出范围
  • @MSaad 看看我的回答。
  • 我添加了一个答案,可以让你摆脱整个循环,可能会让你的代码更干净。
  • 这里到底发生了什么?是 C# 还是 Java?为什么你将你的类称为“java”,但缺少大写字母?

标签: c# .net arrays


【解决方案1】:

迭代多维数组需要你用它自己的长度来迭代每个维度,这意味着ij应该分别是0-30-1

如图所示,但对于不同维度的数组:

GetLength(0) 将返回 4。

GetLength(1) 将返回 3。

i = (0 to Length) j = (0 to Length) Length = Height * Width = 8 在你的情况下,你正在做的是迭代它们这意味着 8 比 8

所以你的count() 方法应该是这样的:

public int count(int[,] list,int n)
{
    int c = 0;
    for (int i = 0; i < list.GetLength(0); i++)
    {
        for (int j = 0; j < list.GetLength(1); j++)
        {
            if (list[i, j] == n)
            {
                c++;
            }
        }
    }
    return c;
}

如果您想将数组迭代为一个数组数组,而不是让“我现在迭代哪个维度?”让事情变得复杂,您可以使用@987654322 @(当然还有更多需要考虑的事情),这将允许您将整个方法替换为这个简短的Linq

public int count(int[][] list,int n)
{
    return list.SelectMany(x => x).Count(x => x == n);
}

或:

public int count(int[][] list, int n)
{
    return list.Sum(x => x.Count(y => y == n));
}

【讨论】:

    【解决方案2】:

    注意内部for 中的ij。 并使用i &lt;list.GetLength(0)j &lt; list.GetLength(1) 对抗list.Length

    class java
    {
        public int count(int [,] list,int n)
        {
            int c = 0;
            for (int i = 0; i < list.GetLength(0); i++)
            {
                for (int j = 0; j < list.GetLength(1); j++)
                {
                    if (list[i, j] == n)
                    {
                        c++;
                    }
                }
            }
            return c;
        }
    
    class Program
    {
        static void Main(string[] args)
        {
            java jv = new java();
            int[,] arr = { {3,5,7,94 }, {5,6,3,50 } };
            int k=5;
            Console.WriteLine(jv.count(arr,k));
        }
    }
    

    【讨论】:

    • 你领先我几秒!
    • 这是一个意外。祝你好运,玩得开心;)
    • @MSaad 使用int k=5;
    • @MSaad 并使用Console.WriteLine(jv.count(arr,k));
    • @MSaad 确实了解您的错误并尽量避免它们下次:)
    【解决方案3】:

    由于Array 已实现IEnumerable,您可以在此处简单地使用foreach 循环(随意将静态更改为实例方法):

        public static int count(int[,] list, int n)
        {
            int c = 0;
            foreach (var item in list) if (item == n) c++;
            return c;
        }
    

    用法:

      static void Main()
        {
            var r = count(new int[,]{
                {
                    5, 8, 7, 8
                }, 
                {
                    0, 8, 9, 3
                }}, 8);
    
            Console.WriteLine(r);
    

    输出:3

    附: 一般来说,如果可能的话,最好使用 for 循环,因为它比 foreach 快,但在这种情况下,我喜欢如果你使用 foreach 你没有嵌套的 for 循环,也没有 GetLength(x) 调用它只需一行代码,它的性能几乎相同......

    【讨论】:

      【解决方案4】:

      你的错误在这一行:

      for (int j = 0; i < list.Length; j++)
      

      应该是

      for (int j = 0; j < list.Length; j++)
      

      【讨论】:

      • 您是否将返回的值存储在任何地方?如果你不是,那没有用吗?
      • 我正在将值返回给 c "return c;"
      • 不,我的意思是你存储返回的值?例如int i = jv.count(arr, k)。并且 k = 0,这在您的数组中不存在。
      猜你喜欢
      • 2014-01-13
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      相关资源
      最近更新 更多