我想写一个脚本来检查3个变量(A,B,C)是否都是唯一的并且彼此不相等。我想过做一个很大的if语句,如:
if (A != B) && (A != C) && (B != C){
// do function }
我只是想知道是否还有其他办法?因为代码看起来很笨重。这是在Perl。
答案 0 :(得分:10)
抽象复杂的细节(例如那些“看起来很笨拙”)是潜艇的要点。如果您不喜欢看到它,请将逻辑移动到子。就个人而言,对于我来说,三个变量看起来很好。
请注意,如果您要将代码移动到子代码,则可以考虑使用O(N)算法。你目前的方法规模很小(O(N 2 ))。
sub are_distinct {
my %seen;
++$seen{$_} for @_;
return keys(%seen) == @_;
}
优化退出:
sub are_distinct {
my %seen;
for (@_) {
return 0 if $seen{$_}++;
}
return 1;
}
答案 1 :(得分:8)
您可以使用List::MoreUtils
中的uniq函数获取所有唯一元素,然后将长度与原始元素数进行比较。
#!/usr/bin/perl
use strict;
use warnings;
use List::MoreUtils qw(uniq);
my ($A, $B, $C) = (1, 2, 3);
my @elems = ($A, $B, $C);
if ( uniq(@elems) == @elems ) {
# do function
}
答案 2 :(得分:3)
你可以写一个函数,
sub all_unique {
my %seen;
return (@_ == grep !$seen{$_}++, @_);
}
if (all_unique($A, $B, $C)) { .. }
答案 3 :(得分:0)
有三个变量,没有什么真正“大”,只有三个比较。
如果你想推广更多的变量,比如说N,那么提高效率就变得有用了。
如果您进行详尽的比较,则需要进行N(N-1)/2
次比较(例如N=10 -> 45
)。
更好的方法是排序然后使用N-1
比较(例如N = 10 - > 9:A!=B && B!=C && C!=D
...)。
答案 4 :(得分:-1)
我在.NET中使用HashSet<T>
:
var myVariables = new List<int> { A, B, C };
var hashset = new HashSet<int>(myVariables);
if (hashset.Count != myVariables.Count)
{
// There was at least one duplicate value / hash collision
}
我想在PERL中有类似的数据结构,等等。 :)