代码之家  ›  专栏  ›  技术社区  ›  Joey

PowerShell,内置的集合交集类型?

  •  6
  • Joey  · 技术社区  · 15 年前

    对于一些需要从一堆松散字母中找到变位词的游戏,我最终实现了一个排列算法,以查找所有可能的变位词,并在已知字母位置需要时过滤这些变位词。( -match 顺便说一下,很好)。但是对于更长的单词来说,这被证明是非常容易出错的,因为浏览大量的胡言乱语并不能真正揭示隐藏在其中的正确单词。

    所以我想 如果 我要一大份英文单词表(应该可以在某个地方买到)我 能够 只要把我的排列列表和合适的单词列表交叉,从排列列表中得到(希望)所有真实的单词。

    由于PS中的许多运营商对集合的工作方式不同,我想我可以做一些类似的事情

    $wordlist -contains $permlist
    

    回到十字路口。不幸的是,这并不容易。我想到的其他选项是迭代一个列表并执行 -contains 每个项目:

    $permlist | ? { $wordlist -contains $_ }
    

    这可能会奏效,但也很慢,我想(尤其是当 $wordlist 是一个 gc wordlist.txt )或者我可以构建一个巨大的正则表达式:

    $wordlist -matches (($permlist | %{ "^$_`$" }) -join "|")
    

    但这也可能不是很快。我也可以用 findstr 上面有一个巨大的正则表达式,但这感觉是错误的。

    有没有我可以使用的内置解决方案,这比我目前的尝试更好?否则,我可能会将单词列表放入哈希表中,并使用迭代 -包含 应该足够快的方法。

    2 回复  |  直到 7 年前
        1
  •  6
  •   NateJ Richard Berg    7 年前
    $left = New-HashSet string
    $left.Add("foo")
    $left.Add("bar")
    $right = New-HashSet string
    $right.Add("bar")
    $right.Add("baz")
    
    $left.IntersectWith($right)
    $left.UnionWith($right)
    

    (从中借用新哈希集 Josh Einstein )

    警告:哈希集上的这些方法是修改原始集合的就地算法。如果要对不可变对象进行功能样式转换,则需要将Linq带到聚会:

    add-type system.core
    
    $asqueryable = [system.linq.queryable].getmethods() | ? { $_.name -eq "AsQueryable" } | select -first 1
    $asqueryable = $asqueryable.MakeGenericMethod([string])
    $leftAsQueryable = $asqueryable.Invoke($null, (,$left))
    
    $intersect = [system.linq.queryable].getmethods() | ? { $_.name -eq "Intersect" } | select -first 1
    $intersect = $intersect.MakeGenericMethod([string])
    $result = $intersect.Invoke($null, ($leftAsQueryable, $right))
    

    显然,有人需要将这个静态的通用反射垃圾打包到一个友好的Cmdlet中!别担心,我正在努力…

        2
  •  0
  •   nik    15 年前

    您可以拼写检查单词列表,并根据标准字典消除所有拼写错误。

    GNU aspell 已安装程序包,

     cat text.txt | aspell list
    

    会给你一张所有拼写错误单词的清单。
    您可以使用其他字典 阿斯贝尔 .


    或者只是拿起一个 anagram generator like this one made for Scrabble players .

    Revolution单词查找器有两个选项:变位词查找器和拼字解算器。anagram finder获取一个字母列表,并返回所有可以使用它们相对于固定单词列表创建的有效anagram。每一个变位词都会根据 SOWPODS 单词表,是当前国际拼字比赛中使用的单词表。