arrays - 在有但有一个转折中获得完全匹配

标签 arrays perl hash

我有一些我无法理解的事情

假设我有一个用于接收和拨出的电话列表,如下所示。还指定了 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/

相关文章:

javascript - 数组作为参数传递,但函数内重新分配失败?

java - 无法为数组分配随机数

xml - 如何生成没有尾部 "/"的XML标签?

multithreading - 线程 perl 中未锁定的共享哈希操作安全性

perl - 如何将哈希插入到 Perl 中的哈希中

c - 在 C 中将动态数组设置为彼此相等

ios - iOS特定字符串的排序数组

regex - 使用正则表达式从 Perl 纯文本中提取 URL

javascript - Director.js 和 Turbolinks - 更改窗口哈希并使用然后返回

ubuntu - 理解和破解salted sha512 hashes