arrays - 相同字符的二维数组

标签 arrays powershell multidimensional-array

我正在尝试二维数组。我想要某种具有相同字符的矩阵。我可以定义一个带有固定元素的空白多维数组,并使用循环为它提供一个字符。但是,我也可以执行@(something)*n来直接定义已经提供了一些东西的数组。

根据我到目前为止的了解,这是怎么做的:

> $arr = ,(,'E'*3)*3

这些似乎还不错:
> $arr[1]
E
E
E
> $arr[1][2]
E

但是,当我尝试在某处替换字符(例如$arr[1][2] = 'D')时,将替换许多字符:
> $arr
E
E
D
E
E
D
E
E
D

我的数组定义错误吗?补充:那么,如何正确地“快速”定义它?

最佳答案

在非数字值上使用*运算符可创建原始值的副本。但是,如果您要复制的项目不是String或Char之类的原始(-ish)类型,则结果将不是该对象的重复项,而是对象引用的副本。由于所有实例都将指向同一对象,因此更改一个实例将全部更改。

要创建不同的实例,您需要在循环中重复数组实例化,如PetSerAl在注释中所示:

$arr = 1..3 | ForEach-Object { ,(,'E' * 3) }

在这种特殊情况下,您还可以创建一个"template"数组并将其克隆:
$a0 = ,'E' * 3
$arr = 1..3 | ForEach-Object { ,$a0.Clone() }

但是请注意,克隆对象将而不是克隆嵌套的对象引用,因此后者并不是在所有情况下都可行的方法。

这样的事情将无法按您的预期方式工作(因为在克隆数组对象后,嵌套哈希表对象的引用仍指向相同的实际哈希表):

PS C:\> $ a0 =([PSCustomObject] @ {'x'='E'}),([[PSCustomObject] @ {'x'='E'})
PS C:\> $ arr = 1..2 | ForEach-Object {,$ a0.Clone()}
PS C:\> $ arr

X
--
Ë
Ë
Ë
Ë

PS C:\> $ arr [1] [1] .x ='F'
PS C:\> $ arr

X
--
Ë
F
Ë
F

但是这样的事情会起作用:

PS C:\> $ arr = 1..2 | ForEach-Object {,((([PSCustomObject] @ {'x'='E'}),([PSCustomObject] @ {'x'='E'}))}
PS C:\> $ arr

X
--
Ë
Ë
Ë
Ë

PS C:\> $ arr [1] [1] .x ='F'
PS C:\> $ arr

X
--
Ë
Ë
Ë
F

关于arrays - 相同字符的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51453191/

相关文章:

c - 为什么我从来没有超过1?

powershell - 从 Windows CMD 运行 PowerShell 命令的命令

php - Laravel 多维数组获取值

c - 使用 malloc 作为 2D 数组指针会导致段错误

c# - 整数到整数数组 C#

powershell - Atom - 无法保存文件 : Permission denied (Windows)

powershell - 在Powershell中作为副作用输出

python - 索引超出尺寸 100 的轴 0 的范围

java - 需要使用循环打印出ArrayList中的总数

Javascript/Angular 在洗牌后返回数组