如何用不同的默认值初始化多维数组

Posted

技术标签:

【中文标题】如何用不同的默认值初始化多维数组【英文标题】:How to initialize multi-dimensional array with different default value 【发布时间】:2013-02-11 07:40:04 【问题描述】:

我正在尝试使用 -1 初始化整数值的二维数组。当我创建一个新数组时,它会自动填充为 0。 我知道我可以用 2 个循环来完成它,但我想在构建数组时应该有某种方法可以做到这一点(所以我不必经历两次),这样就可以代替 0,提供值将被插入。可能吗? 如果不是在数组的初始构建期间,是否有其他时间或代码节省方式,或者我是否坚持使用 2 个循环?

【问题讨论】:

这些数组有多大? 数组大小取决于创建它的函数的输入,我忘了提及。直接初始化是不可能的。 【参考方案1】:

在Python中,这种二维数组初始化是错误的:

mat = [[0] * 5] * 5  # wrong
mat = [[0] * 5] for _ in range(5)]  # correct

因为你多次复制内部数组的引用,改变其中一个最终会改变所有。

mat[0][0] = 1
print(mat)
# 1 0 0 0 0
# 1 0 0 0 0
# 1 0 0 0 0
# 1 0 0 0 0
# 1 0 0 0 0

在 C# 中,我们也有类似的问题。

var mat = Enumerable.Repeat(Enumerable.Repeat(0, 5).ToArray(), 5).ToArray();

由于数组是引用类型,所以外面的Repeat()实际上是在复制内部数组的引用。

如果您确实需要在不使用 for 循环的情况下创建和初始化多维数组,那么自定义帮助类可能会有所帮助:

static class HelperFunctions

    public static T[][] Repeat<T>(this T[] arr, int count)
    
        var res = new T[count][];
        for (int i = 0; i < count; i++)
        
            //arr.CopyTo(res[i], 0);
            res[i] = (T[])arr.Clone();
        
        return res;
    

那如果你想用的话:

using static HelperFunctions;

var mat = Enumerable.Repeat(0, 5).ToArray().Repeat(5);

这样就可以了。

【讨论】:

【参考方案2】:

试试这样的:int[,] array2D = new int[,] -1 , -1 , -1 , -1 ;

或带有维度int[,] array2D = new int[4,2] -1,-1 , -1,-1 , -1,-1 , -1,-1 ;

【讨论】:

不确定为什么 -1 - 这对于小型二维数组完全有效,并且在这种情况下是最佳选择。来自我的 +1...(不过,如果数组很大,这将很快停止维护) 我也一样,我忘了提到原始问题中的重要细节。 没关系,@ReedCopsey 很好地回答了你的问题,我猜【参考方案3】:

对于多维数组,循环很可能是最好的方法,除非数组小到可以直接在代码中初始化。

如果您使用jagged array,您可以初始化第一个子数组,然后使用Array.Copy 将这些值复制到彼此的子数组中。这仍然需要对第一个子数组进行一次迭代,然后对 N-1 个外部数组进行一次循环,但复制操作将比循环更快。

【讨论】:

我确实在使用多维数组。好吧,我想那时我将不得不走“老派”的道路。

以上是关于如何用不同的默认值初始化多维数组的主要内容,如果未能解决你的问题,请参考以下文章

Java 基础知识点 笔记总结

在 C++ 中返回多维数组的函数

多维数组

我正在尝试设置一些不同的多维数组,但无法弄清楚为啥这不起作用

如何添加来自不同数组的多维数组值

C++ 更优雅的方式在多维数组中设置默认值