如何将数组中的第一个元素移动到powershell中的最后一个位置?

问题描述 投票:1回答:2

我有一个大约有10个项目的powershell数组。我正在尝试获取数组的第一个元素(0)并将其移动到最后一个项目。最后,阵列中仍然会有(仅)10个项目。

arrays powershell sorting
2个回答
1
投票

如果你想要就地旋转数组,这比在Powershell中手动迭代和移动元素更有效(.NET Array.Copy类似于Java System.arraycopy):

New-Variable -Name first -Value $arr[0] -Scope Private
[array]::Copy($arr, 1, $arr, 0, $arr.Length - 1)
$arr[$arr.Length - 1] = $Private:first

如果需要复制(10个元素应该没问题):

$arr = $arr[1 .. ($arr.Length - 1) + 0]

Powershell允许通过+算子组合两个或更多范围。特别是如果您希望数组是不可变的,这应该是最佳解决方案。


1
投票

如果您不介意创建新阵列,这里有一个简洁的解决方案:

$a = 1..10 # sample array: 1, 2, ..., 10

$a = $a[1..($a.count-1)] + $a[0]

minmaxavg最终在their answer提出了一个更简洁的选择:$a[1..($a.count-1) + 0] 在性能方面,这两种解决方案几乎完全相同。 此外,他们的[array]::Copy()解决方案是一种更有效的就地替代方案 - 以牺牲更复杂的写入为代价;它可以简化为: $first = $a[0]; [array]::Copy($a, 1, $a, 0, $a.Count - 1); $a[-1] = $first

$a现在包含:

2
3
4
5
6
7
8
9
10
1
  • $a[1..($a.count-1)]返回一个新数组,其中包含$a的所有元素,这些元素以索引1中的元素开头,即从第2个元素开始。 1..($a.count-1)是一个范围表达式,它本身创建一个数组 - 从输入数组中提取的索引数组。 暂且不说:PowerShell支持索引-1来引用数组的最后一个元素,-2来引用倒数第二个,依此类推。但是,在某个范围内使用负指数可能无法达到您的预期;例如,1..-1不提取从第二个到倒数第二个的所有元素;相反,它提取索引为10-1(最后一个)的元素,因为它们是范围运算符(..)生成的数组(索引)的元素。
  • + $a[0]将第一个元素“追加”到新数组;从技术上讲,这会创建另一个数组,它是LHS和RHS元素的串联。
  • 总之,在此过程中创建了3个阵列:幕后的2个辅助,瞬态,以及分配回$a的结果数组。
  • 因此,虽然使用范围运算符(..)来提取数组切片并使用+来连接数组非常方便,但它效率不高,尽管通常无关紧要的小数组 - 谨防“附加”到数组中的数组然而,使用+=循环,因为您将在每次迭代中重新创建数组。
© www.soinside.com 2019 - 2024. All rights reserved.