【问题标题】:Adding element at specified index location in an array. Powershell在数组中的指定索引位置添加元素。电源外壳
【发布时间】:2013-11-26 03:06:03
【问题描述】:

我是 Powershell 的新手,正在尝试将一些功能组合在一起。我创建了一个从输入创建数组的函数。我也在尝试创建一个在指定索引处添加元素而不使用列表的函数(我知道列表要容易得多,但我试图了解如何在没有列表的情况下做到这一点)。

到目前为止,这是我的代码。我只是无法让它工作,我已经尝试使用循环和下面的代码,感谢任何帮助。

亲切的问候!

Function Create_array ($index, $value)
{
$array = new-object array[] $index
if ($value)
{
    for ($i = 0;$i -lt $array.length;$i++)
    {
        $array[$i] = $value
    }
    write-host ""
    write-host "Grattis!! Din array är nu skapad med angivet index och värde."
}
else
{
    for ($i = 0;$i -lt $array.length;$i++)
    {
        $array[$i] = "Hej $env:username och välkommen till Dennis och Jonas script. Detta är en defaulttext, ange ett eget index följt av önskat värde"
    }
    write-host ""
    write-host "Array är nu skapad med defaultvärden"
}
return $array
}


Function Add_to_array ($nyarray, $value, $index) # Lägger till ett värde på angivet index eller längst ner om index ej anges.
{
if ($index -gt $nyarray.length)
{
    $i = $nyarray.length
    write-host "Du har angivit ett felaktigt index. Din array innehåller $i element"
}
elseif ($index -gt 2) # Kollar om det angivna indexet är större än 2
{
    $nyarray[$index - 2] += $värde # Om större än 2: Angivna värdet läggs in på angivet index ($index - 2)
    write-host "Element är nu inlagt på angivet index i din array"
}                      # och resten flyttas ner.
elseif ($index -eq 1) # Kollar om angivet index är mindre än 2
{
    $nyarray[0] += $värde # Om mindre sätts det angivna värdet in på index 1 (0)
    write-host "Element är nu inlagt på angivet index i din array"
}
else
{
    $nyarray += $värde # Om inget index anges sätter denna funktion in det angivna värdet längst ner.
    write-host "Element är nu inlagt längst ner i din array"
}
return $nyarray # Lägger in den "nya" arrayen i det variabelnamn man valt.
}

【问题讨论】:

标签: arrays function powershell


【解决方案1】:

这就是我管理它的方式。包装成一个函数。虽然你可能有问题。如果您的数组值很长。

$myArray = @("how","to","slice","into","an","array")

Function Insert-ToArray($Array, $insertAfter, $valueToInsert){
#find the index of value before insertion
$insertPoint = $Array.IndexOf($insertAfter)
#split the array into two parts
$firstHalf = $Array[0..$insertPoint]
$secondHalf = $Array[($insertPoint +1)..$Array.Length]
#slice into a new array
$newArray = @($firstHalf,$valueToInsert,$secondHalf)
return $newArray
#returning this new array means you can assign it over the old array
}

$myArray = Insert-ToArray -Array $myArray -insertAfter "slice" -valueToInsert "something"

$myArray

【讨论】:

    【解决方案2】:

    你可以用数组切片来做到这一点:

    $array = @(1,2,4,5)
    $value = 3
    $index  = 2
    
    $array = $array[0..($index -1)],$value,$array[$index..($array.Length -1)]
    
    $array
    

    【讨论】:

    • 这个数组构建不会像你想象的那样工作。 $array = $array[0..($index -1)] + $value + $array[$index..($array.Length -1)]
    • 你和你的逗号浪费了我一个小时。你介意修复它们还是模组可以做到这一点?我很欣赏你的回答,但这是错误的。 $array = @(1,2,4,5) $value = 3 $index = 2 $array = $array[0..($index -1)],$value,$array[$index..($array.Length -1)] $array > $array.count 3你创建了 3 个数组。
    【解决方案3】:

    正如您声称您正在尝试了解如何在没有 List 的情况下工作,我将解释数组如何在幕后工作。这种数据操作主要在低级编程中遇到,例如数据结构类和 C 编程。 Java、C# 和 Powershell 等高级语言确实采用了这些技术,但实际实现对用户来说是隐藏的。尽管如此,运行时还是会执行类似于这些步骤的操作。

    数组作为基本数据结构实际上并不支持插入。 Array 只支持读写操作。将数组视为平方数学纸,其中每个数组单元都是纸上的正方形。在纸上写一些文字(管道字符说明正方形,数字是索引):

     0 1 2 3 4 5 6 7
    |t|s|t| |t|e|x|t|
    

    现在考虑在单词tst 中插入缺失的e 字母以使其成为test。会发生什么?需要一个新数组:

     0 1 2 3 4 5 6 7 8
    |t|e|s|t| |t|e|x|t|
    

    请注意,将e 插入第二个单元格后,所有剩余的字母都会向前移动一步。所以发生了什么事?你手动插入的程序是这样的,

    1. 将原始数组中的项目复制到新数组中,直到读取索引为 插入索引
    2. 在插入时将插入的字符添加到新数组中 索引
    3. 将原始数组中的项目复制到新数组中。插入索引 比读取索引大一

    如您所见,这个过程有点繁琐。在纸上“插入”一个字母时,您不会在原始数组中创建新的空单元格。您必须手动复制所有元素。

    作为全新数组的替代方案,您可以通过在其中添加一个额外的单元格来调整数组的大小。然后,不是将字母复制到新数组,而是从数组的末尾开始,向前复制字母直到插入索引处。然后你添加插入的字母并停止。所以,

     0 1 2 3 4 5 6 7 8
    |t|s|t| |t|e|x|t| | # start
    |t|s|t| |t|e|x|t|t| # moved last t to the end
    |t|s|t| |t|e|x|x|t| # overwrite old t with x
    |t|s|t| |t|e|e|x|t| # overwrite old x with e
    |t|s|t| |t|t|e|x|t| # and so on
    |t|s|t| | |t|e|x|t|
    |t|s|t|t| |t|e|x|t|
    |t|s|s|t| |t|e|x|t| # insert location reached after this
    |t|e|s|t| |t|e|x|t| # don't overwrite s with t but e. Done!
    

    既然您了解了数组插入的工作原理,那么 mjolinor 的示例就很容易理解了。通过将元素从开始复制到插入点,添加插入并复制数组的其余内容来创建一个新数组。

    【讨论】:

      【解决方案4】:

      如果我们需要结果中的平面数组,我们可以使用 sum 运算符:

      下面的代码在 $array1 的第 4 位添加[string]'Word'

      $new_array = @($array1[0..3]) + @('Word') + @($array1[4..5])
      

      用例是将两个平面数组连接在一起,或者在固定数组的某个位置添加一些数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-29
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多