【发布时间】:2017-09-17 17:20:23
【问题描述】:
我仍在尝试进行排列匹配,我想知道是否有人有更好的方法来做到这一点。我想以任何顺序匹配数组中的所有模式,即匹配数组中项目(字符串或其他对象)的排列。例如,如果数组是 (1,2,3),那么如果一个字符串以任意顺序包含 1 和 2 和 3,则为真;即,如果字符串包含 (1,2,3) 的排列,则为 true。
我现在拥有的是这样的:
my @x = < one eins uno yi two zwei dos er one one one two two two >;
my @z = < one eins uno yi two zwei dos er one one one two two two foo >;
my $y = "xxx one eins uno yi two zwei dos er xxx";
sub matchAllWords($aString, @anArray) {
my $arraySize = @anArray.elems;
if $arraySize == 0 { False; }
elsif $arraySize == 1 {
($aString.match(/:i "@anArray[0]" /)).Bool;
} else {
my $firstCheck = ($aString.match(/:i "@anArray[0]"/)).Bool;
if $firstCheck {
$firstCheck
and
(matchAllWords($aString, @anArray[1..*]));
} else {
return False;
}
}
}
say matchAllWords($y, @x);
# result is True, but it should NOT be True because $y should not
# match permutations of @x which contains multiple identical elements
# of "one" and "two"
say matchAllWords($y, @z); # False as expected;
问题是我的函数匹配数组中的所有唯一单词,但无法区分重复单词的排列。我可以添加越来越多的代码来判断一个单词是否匹配,但是更多的代码来完成一个简单的想法,“排列匹配”,是不完美的。有什么建议么?谢谢
【问题讨论】:
-
我不清楚你想要实现什么。你想检查数组
ntimes 中包含的每个元素是否也恰好出现在字符串ntimes 中?还是别的什么? -
你看过
Bags并设置操作符吗?感觉就像您想以某种方式(身份/子集)比较两个包。这就是你想要的吗? -
你不能只对两个列表进行排序吗?
-
谢谢 smls、伊丽莎白和布拉德!抱歉不清楚。这是我想要实现的一个例子。说,我有一个字符串 $x="a1bb3dd2xyz";我想知道 $x 是否会匹配字符串数组的排列。如果我的数组@a = ,那么任何包含“1”、“a”和两个“2”的字符串都将匹配; $x 将不匹配; “xx22yy1wwa”和“wwayy2zz2mm1”应该匹配,但“xx2y1wa”不应该因为它只有一个“2”,而“z12bba1”不应该因为它有额外的“1”。所以,它并不完全像 Bag。 smls 说的和我想做的很接近。非常感谢大家!!
-
对不起,澄清我上面的评论。 “z12bba1”不应该,因为它有额外的“1”而缺少一个“2”。
标签: match permutation raku