我有兩套
@ a=(2,5,3)@ B=(3,4,1), I want to get (2,5,4,1)
輸出是換行符、空格還是逗號并不重要
我的想法是:
Intersection @ c=(2,5,3,4,1), union @ d=(3), result: @ c - @ d=(2,5,4,1)
有沒有更優雅的解決方案(我不喜歡安裝額外的模塊)
uj5u.com熱心網友回復:
使用哈希是表示集合的最簡單方法(鍵是集合的成員,值可以表示任何含義;經常undef使用)。這是一些代碼(可能更緊湊):
@a = (2,5,3);
@b = (3,4,1);
foreach $val ( @a ) { $d{$val} |= 1 };
foreach $val ( @b ) { $d{$val} |= 2 };
foreach $val ( keys(%d) ) {
push(@result, $val) if $d{$val} != 3;
}
print(join(",", @result));
我們在 的值中使用兩個位%d來表示每個集合中的成員資格,并跳過兩個集合中的值。
uj5u.com熱心網友回復:
雖然我適當地注意到問題的前提
我不喜歡安裝額外的模塊
我仍然想展示庫的實用性。使用Set::Scalar
use warnings;
use strict;
use feature 'say';
use Set::Scalar;
my @ary1 = (2,5,3);
my @ary2 = (3,4,1);
# "want to get (2,5,4,1)"; like union - intersection
my $s1 = Set::Scalar->new(@ary1);
my $s2 = Set::Scalar->new(@ary2);
my $u = $s1->union($s2);
my $i = $s1->intersection($s2);
my $res = $u - $i;
say $res;
# Or just
my $symm_diff = $s1->symmetric_difference($s2);
say $symm_diff;
列印 (1 2 4 5)一行,兩次。
這種特殊的集合操作稱為對稱差分,圖書館有它以及最后顯示的。這個庫可以做的還有很多;這只是基本的東西。
還有相關的Set::Object,具有不同的傾斜度,但也具有上述所有方法(包括symmetric_difference),用于直接滿足此需求。
在串列操作庫中,我會提到List::Compare,它也直接解決了這個問題并且還有更多。
uj5u.com熱心網友回復:
my %s;
$s{ $_ } |= 1 for @a; # Sets bit 0 for elements of set @a
$s{ $_ } |= 2 for @b; # Sets bit 1 for elements of set @b
my @union = keys %s; # One or two bits set
my @isect = grep { $s{ $_ } == 3 } keys %s; # Both bits set
my @symdiff = grep { $s{ $_ } != 3 } keys %s; # Only one bit set
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521574.html
標籤:perl
上一篇:正則運算式僅在多行匹配中
