获取数组的所有组合

蓝莓蛋糕

我目前正在尝试制作一个函数,以获取数组值的所有可能组合。

我想出了一个非函数版本,但它限制为3个值,所以我正试图使它变得更强大。 Dynamic

我试着搜索SO,但是找不到我想做的powershell示例,我可以找到一个PHP版本,但是我的PHP非常有限

PHP:如何获得一维数组的所有可能组合?

非功能脚本

$name = 'First','Middle','Last'

$list = @()

foreach ($c1 in $name) {
    foreach ($c2 in $name) {
        foreach ($c3 in $name) {
            if (($c1 -ne $c2) -and ($c2 -ne $c3) -and ($c3 -ne $c1))
            {
                $list += "$c1 $c2 $c3"
            }
        }
    }
} 

这给了我结果

First Middle Last
First Last Middle
Middle First Last
Middle Last First
Last First Middle
Last Middle First

我不确定在递归该函数时如何重新排列值,这是我到目前为止所拥有的:

<#
.Synopsis
    Short description
.DESCRIPTION
    Long description
.EXAMPLE
    Example of how to use this cmdlet
.EXAMPLE
    Another example of how to use this cmdlet
#>
function Get-Combinations
{
    [CmdletBinding()]
    [OutputType([int])]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [string[]]$Array,

        # Param1 help description
        [Parameter(Mandatory=$false,
                   ValueFromPipelineByPropertyName=$false,
                   Position=1)]
        [string]$Temp,

        # Param1 help description
        [Parameter(Mandatory=$false,
                   ValueFromPipelineByPropertyName=$true,
                   Position=2)]
        [string[]]$Return
    )

    Begin
    {
        Write-Verbose "Starting Function Get-Combinations with parameters `n`n$($Array | Out-String)`n$temp`n`n$($Return | Out-String)"

        If ($Temp)
        {
            $Return = $Temp
        }

        $newArray = new-object system.collections.arraylist
    }
    Process
    {
        Write-Verbose ($return | Out-String)

        For($i=0; $i -lt $Array.Length; $i++)
        {
            #Write-Verbose $i

            $Array | ForEach-Object {$newArray.Add($_)}
            $newArray.RemoveAt($i)

            Write-Verbose ($newArray | Out-String)

            if ($newArray.Count -le 1)
            {
                Get-Combinations -Array $newArray -Temp $Temp -Return $Return
            }
            else
            {
                $Return = $Temp
            }
        }
        $newArray
    }
    End
    {
        Write-Verbose "Exiting Function Get-Combinations"
    }
}

$combinations = @("First","First2","Middle","Last")

$Combos = Get-Combinations -Array $combinations

$Combos

但是我得到的输出无处不在

First2
Last
First2
Last
First
First2
Middle
Last
First
First2
Middle
Last

28/08更新

越来越近,但输出仍然很奇怪

<#
.Synopsis
    Short description
.DESCRIPTION
    Long description
.EXAMPLE
    Example of how to use this cmdlet
.EXAMPLE
    Another example of how to use this cmdlet
#>
function Get-Combinations
{
    [CmdletBinding()]
    [OutputType([int])]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true,
                    ValueFromPipelineByPropertyName=$true,
                    Position=0)]
        [string[]]$Array,

        # Param1 help description
        [Parameter(Mandatory=$false,
                    ValueFromPipelineByPropertyName=$false,
                    Position=1)]
        [string]$Temp,

        # Param1 help description
        [Parameter(Mandatory=$false,
                    ValueFromPipelineByPropertyName=$true,
                    Position=2)]
        [string[]]$Return
    )

    Begin
    {
        Write-Verbose "Starting Function Get-Combinations with parameters `n`n$($Array | Out-String)`n$temp`n`n$($Return | Out-String)"

        If ($Temp)
        {
            $Return += $Temp
        }

        #$newArray = new-object [System.Collections.ArrayList]
        #$Array | ForEach-Object {$newArray.Add($_) | Out-Null}

        [System.Collections.ArrayList]$newArray = $Array
    }
    Process
    {
        Write-Verbose "return -> $return"

        For($i=0; $i -lt $Array.Length; $i++)
        {
            Write-Verbose "`$i -> $i"

            $element = $newArray[0]
            $newArray.RemoveAt(0)

            Write-Verbose "`$newArray -> $newArray"
            Write-Verbose "Element -> $element"

            if ($newArray.Count -gt 0)
            {
                Get-Combinations -Array $newArray -Temp (($temp + " " +$element).Trim()) -Return $Return
            }
            else
            {
                $Return = $Temp + " " + $element
            }
        }
        $return
    }
    End
    {
        Write-Verbose "Exiting Function Get-Combinations"
    }
}

$combinations = @("First","First2","Middle","Last")

$return = @()

$Combos = Get-Combinations -Array $combinations -Return $return

$Combos

新的输出(是的,“ Last”值前有一个空格,不,我不知道为什么)

First First2 Middle Last
First First2 Last
First Middle Last
First Last
First2 Middle Last
First2 Last
Middle Last
 Last
戴维·布拉本特

这是我的解决方案:

function Remove ($element, $list)
{
    $newList = @()
    $list | % { if ($_ -ne $element) { $newList += $_} }

    return $newList
}


function Append ($head, $tail)
{
    if ($tail.Count -eq 0)
        { return ,$head }

    $result =  @()

    $tail | %{
        $newList = ,$head
        $_ | %{ $newList += $_ }
        $result += ,$newList
    }

    return $result
}


function Permute ($list)
{
    if ($list.Count -eq 0)
        { return @() }

    $list | %{
        $permutations = Permute (Remove $_ $list)
        return Append $_ $permutations
    }
}

cls

$list = "x", "y", "z", "t", "v"

$permutations = Permute $list


$permutations | %{
    Write-Host ([string]::Join(", ", $_))
}

编辑:同一功能(置换)相同。这有点作弊,但是由于我替换了lambdas的普通函数。您可以用自己处理的堆栈替换递归调用,但这会使代码不必要地变得复杂...

function Permute ($list)
{
    $global:remove = { 
        param ($element, $list) 

        $newList = @() 
        $list | % { if ($_ -ne $element) { $newList += $_} }  

        return $newList 
    }

    $global:append = {
        param ($head, $tail)

        if ($tail.Count -eq 0)
            { return ,$head }

        $result =  @()

        $tail | %{
            $newList = ,$head
            $_ | %{ $newList += $_ }
            $result += ,$newList
        }

        return $result
    }

    if ($list.Count -eq 0)
        { return @() }

    $list | %{
        $permutations = Permute ($remove.Invoke($_, $list))
        return $append.Invoke($_, $permutations)
    }
}

cls

$list = "x", "y", "z", "t"

$permutations = Permute $list

$permutations | %{
    Write-Host ([string]::Join(", ", $_))
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取数组中元素的所有组合

来自分类Dev

动态获取数组所有元素的所有组合

来自分类Dev

数组的所有组合

来自分类Dev

获取所有组合

来自分类Dev

获取数组元素的所有有序、连续组合

来自分类Dev

如何在Spark中获取数组列的所有组合?

来自分类Dev

如何从多个数组中获取所有组合?

来自分类Dev

从N个数组中获取所有组合

来自分类Dev

从字符串数组获取所有可能的名称组合?

来自分类Dev

PHP获取2个数组之间的所有组合

来自分类Dev

如何从数组中获取所有可能的组合?

来自分类Dev

从MongoDB聚合中的数组获取所有可能的组合

来自分类Dev

获取多维数组的N个元素的所有组合

来自分类Dev

获取C++中多维数组元素的所有组合

来自分类Dev

如何在 Ruby 中获取数组元素的所有组合?

来自分类Dev

数组的所有可能组合

来自分类Dev

获取所有项目组合

来自分类Dev

获取所有术语组合

来自分类Dev

获取具有固定值和数组模型的数组的所有可能组合

来自分类Dev

从对象的数组列表的数组列表中获取所有可能的组合

来自分类Dev

获取有向图组合的所有组合

来自分类Dev

获取任何长度的所有组合,没有子组合

来自分类Dev

从数组中获取大小为n的所有组合的算法(Java)?

来自分类Dev

获取三个数组的所有可能组合,而不重复

来自分类Dev

获取形成给定字符串的数组元素的所有组合

来自分类Dev

从数组获取给定数量的元素的所有唯一组合

来自分类Dev

获取形成给定字符串的数组元素的所有组合

来自分类Dev

如何在Python中获取数组中所有组合的乘积之和?

来自分类Dev

[Javascript]获取所有数组组合(笛卡尔积)

Related 相关文章

热门标签

归档