Как мне переместить 1-й элемент в массиве на последнюю позицию в powershell? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть массив powershell с примерно 10 элементами.Я пытаюсь взять 1-й элемент (0) массива и переместить его в последний элемент.В конце все еще будет (только) 10 элементов в массиве.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Если вы не возражаете против создания нового массива, вот краткое решение:

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

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

minmaxavg в конечном итоге в * 1007 предложило еще более лаконичную альтернативу* их ответ : $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, т. е. начиная с элемента 2nd .

    • 1..($a.count-1)это выражение range , которое само создает массив - массив индексов для извлечения из входного массива.
    • В качестве отступления: PowerShell поддерживает индекс -1 для ссылки на массив последний элемент, -2 для ссылки на предпоследний и т. д.Однако использование отрицательных индексов в диапазоне может не соответствовать вашим ожиданиям;например, 1..-1 не не извлекает все элементы от второго до второго;вместо этого он извлекает элементы с индексами 1, 0 и -1 (последний), потому что это элементы массива (индексов), которые генерирует оператор диапазона (..).
  • + $a[0] «добавляет» элемент first в этот новый массив;технически это создает другой массив, который является объединением элементов LHS и RHS.

  • В итоге, 3 массивы былисозданный в процессе: 2 вспомогательных, временных за кулисами, плюс массив результатов, присвоенный обратно $a.

  • Таким образом, использование оператора диапазона (..) для извлечения фрагментов массива и использование + для объединения массивов очень удобно, но не эффективно хотя с небольшими массивами это обычно не имеет значения - остерегайтесь «добавления» к массиву в цикле с +=, так как вы будете воссоздавать массив на каждой итерации.

0 голосов
/ 14 сентября 2018

Если вы хотите повернуть массив на месте, это более эффективно, чем ручная итерация и смещение элементов в 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 позволяет комбинировать два или более диапазонов с помощью оператора +.Особенно, если вы хотите, чтобы массив был неизменным, это должно быть наиболее оптимальным решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...