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

时间:2018-09-14 03:48:04

标签: arrays powershell sorting

我有一个大约有10个项目的Powershell阵列。我正在尝试采用数组的第一个元素(0),并将其移到最后一个项目。最后,阵列中仍将只有10个项目。

2 个答案:

答案 0 :(得分: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 :(得分:1)

如果您不介意创建一个 new 数组,这是一个简洁的解决方案:

$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)]返回一个 new数组,该数组包含$a的所有元素,它们从索引1的元素开始,即,以< em> 2nd 元素。

    • 1..($a.count-1)是一个 range 表达式,它本身会创建一个数组-从输入数组中提取的索引数组。
    • 顺便说一句:PowerShell支持索引-1引用数组的 last 元素,-2引用倒数第二个,依此类推。但是,在 range 中使用负索引可能无法达到您的预期。例如,1..-1不会提取第二到倒数第二个元素;相反,它提取具有索引10-1(最后一个)的元素,因为这些是范围运算符({{1 }})生成。
  • .. first 元素“追加”到该新数组;从技术上讲,这会创建另一个数组,该数组是LHS和RHS元素的串联。

  • 总而言之,在此过程中创建了 3 个数组:2个幕后辅助,临时数组,以及分配回+ $a[0]的结果数组。

  • 因此,虽然使用范围运算符($a)提取数组切片并使用..连接数组很方便,但效率不高,尽管使用小数组通常并不重要-但是请注意,+会在循环中“附加”到数组,因为您将在每次迭代中重新创建数组。