我有一些我无法理解的事情
假设我有一个用于接收和拨出的电话列表,如下所示。还指定了 from 和 to 位置。
Country1 Country2 number1 number2
USA_Chicago USA_LA 12 14
AUS_Sydney USA_Chicago 19 15
AUS_Sydney USA_Chicago 22 21
CHI_Hong-Kong RSA_Joburg 72 23
USA_LA USA_Chigaco 93 27
现在我想要做的就是删除所有重复项,只给出与国家相关的内容作为键,以及成对分配给它的每个数字,但该对需要是双向的。
换句话说,我需要返回结果,然后像这样打印它们。
USA_Chicago-USA_LA 27 93 12 14
Aus_Sydney-USA_Chicago 19 15 22 21
CHI_Hong-kong-RSA_Joburg 72 23
我尝试了很多方法,包括一个普通的哈希表,结果看起来不错,但它不做双向的,所以我会得到这个。
USA_Chicago-USA_LA 12 14
Aus_Sydney-USA_Chicago 19 15 22 21
CHI_Hong-kong-RSA_Joburg 72 23
USA_LA-USA_Chicago 93 27
所以重复删除以一种方式工作,但因为有另一个方向,它不会删除重复的“USA_LA-USA_Chicago”,它已经作为“USA_Chicago-USA_LA”存在,并将以交换的名称存储相同的数字。
我上次尝试的哈希表是这样的。 (不完全是因为我把很多东西都扔了,不得不为这篇文章重写)
@input= ("USA_Chicago USA_LA 12 14" ,
"AUS_Sydney USA_Chicago 19 15" ,
"AUS_Sydney USA_Chicago 22 21" ,
"CHI_Hong-Kong RSA_Joburg 72 23" '
"USA_LA USA_Chigaco 93 27");
my %hash;
for my $line (@input) {
my ($c1, $c2, $n1, $n2) = split / [\s\|]+ /x, $line6;
my $arr = $hash{$c1} ||= [];
push @$arr, "$n1 $n2";
}
for my $c1 (sort keys %hash) {
my $arr = $hash{$c1};
my $vals = join " : ", @$arr;
print "$c1 $vals\n";
}
因此,如果 A-B 存在,B-A 也存在,则只使用一个,但将要删除的键的值分配给剩余的键。我基本上需要做的是摆脱任何方向上的任何重复键,但将值分配给剩余的键。所以 A-B 和 B-A 会被认为是重复的,但 A-C 和 B-C 不是。 -_-
最佳答案
只需标准化目的地。我选择对它们进行排序。
use strictures;
use Hash::MultiKey qw();
my @input = (
'USA_Chicago USA_LA 12 14',
'AUS_Sydney USA_Chicago 19 15',
'AUS_Sydney USA_Chicago 22 21',
'CHI_Hong-Kong RSA_Joburg 72 23',
'USA_LA USA_Chicago 93 27'
);
tie my %hash, 'Hash::MultiKey';
for my $line (@input) {
my ($c1, $c2, $n1, $n2) = split / [\s\|]+ /x, $line;
my %map = ($c1 => $n1, $c2 => $n2);
push @{ $hash{[sort keys %map]} }, @map{sort keys %map};
}
__END__
(
['CHI_Hong-Kong', 'RSA_Joburg'] => [72, 23],
['AUS_Sydney', 'USA_Chicago'] => [19, 15, 22, 21],
['USA_Chicago', 'USA_LA'] => [12, 14, 27, 93],
)
关于arrays - 在有但有一个转折中获得完全匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18038340/