我正在尝试将 "Return First recurring character in a string problem" 从 python 转换为 powershell

I am trying to convert the "Return First recurring character in a string problem" from python to powershell

我已经在 python 中完成了相同问题的编码,并试图生成类似的逻辑或至少在 powershell 中获得类似的结果。 Python代码-

def FRC(str):
    h = {}

    for ch in str:
        if ch in h:
            return ch
        else:
            h[ch] = 0
    return '[=12=]'
print(FRC("abcdedcba"))

我已经尝试了一些可能的代码并且只能枚举字符数组来计算它们的出现次数。感谢您的任何建议。

Update1 - 我处理的代码如下:

function get-duplicatechar {
   [CmdletBinding()]
   param (
     [string]$teststring
   )

   $hash = @()
   $teststring = $teststring.ToCharArray()

   foreach ($letter in $teststring)
   {
        if($letter -contains $hash){
        return $letter
        }else {
        $hash = $hash + $letter
        }
      return "[=13=]"
    }
}

get-duplicatechar("saahsahh")

这是一个使用您的代码作为基础的工作版本:

function get-duplicatechar {
    [CmdletBinding()]
    param (
    [string]$teststring
    )
    $hash = @{}
    $CharArray = $teststring.ToCharArray()

    foreach ($letter in $CharArray) {
        if($letter -in $hash.Keys) {
            $letter
            break
        }
        else {
            $hash[$letter] = $null
        }
    }
}

一个问题是你将 $teststring 强类型化为一个字符串,所以当你稍后添加一个字符数组时,PowerShell 只是将它转换成一个字符串,因此 $teststring 仍然是一个字符串(尝试 $teststring.GetType() 之后$teststring = $teststring.ToCharArray() 自己看看)。

解决此问题的一种方法是执行我所做的并为字符数组使用不同的变量。您也可以通过将 [string]$teststring 替换为 [char[]]$teststring 直接将变量更改为字符数组来解决它,这样输入到函数的任何字符串都会自动转换为字符数组。

下一个错误是在需要 -in 的地方使用 -contains。该字母不包含该数组,您要在 数组中查找字母 ,就像您在 Python.

中所做的那样

您可以完全删除 return 关键字,PowerShell 不需要它。函数中的任何输出都将自动从函数中输出。

你也称你的集合变量为“hash”,但你创建了一个数组。我将其更改为实际的哈希表,就像在您的 Python 代码中一样。我还更改了我们添加到它的方式,以更准确地反映您在 Python 中所做的事情。有很多方法可以做到这一点,这只是其中一种。请注意,我们还需要在 if 语句中添加“.Keys”,以便我们检查与我们的字母匹配的键。

大概就这些吧,有什么不明白的再问

如果将元素添加到 HashSet<T> 对象并且 false 如果元素已经存在。

function get-duplicatechar {
    [CmdletBinding()]
    param (
      [string]$str
    )

    $h = [System.Collections.Generic.HashSet[char]]::new()

    foreach ($ch in $str.ToCharArray()) {
        if(!$h.add($ch)) { return $ch }
    }
}