3

私には頭の中で理解できないものがあります

以下のように、受信とダイヤルアウトに使用される電話リストが保存されているとします。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

したがって、重複の削除は 1 つの方法で機能しますが、別の方向があるため、既に "USA_Chicago-USA_LA" として存在する重複した "USA_LA-USA_Chicago" は削除されず、同じ番号がスワップされた名前で保存されます。

最後に試したハッシュテーブルはこんな感じ。(私がたくさんを捨てて、この投稿のために書き直さなければならなかったのとは正確には異なります)

 @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";
  }

したがって、AB が存在し、BA も存在する場合は、1 つだけを使用しますが、削除されるキーの値を残りのキーに割り当てます。基本的に必要なのは、任意の方向の重複キーを取り除くことですが、残りのキーに値を割り当てます。したがって、AB と BA は重複と見なされますが、AC と BC は重複していません。-_-

4

2 に答える 2

5

宛先を正規化するだけです。私はそれらを並べることにしました。

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],
)
于 2013-08-03T23:48:35.037 に答える