1

文字列である不明な数のキーで満たされたハッシュがあります。各キーの値は最初はゼロです。

このハッシュを反復処理し、最初の要素を除く各要素について、その値を、別のハッシュの同等値と、このハッシュの前の値に等しくしたいと考えています。数学的には次のようになります。

hash1:a = hash2:a;
hash1:b = hash2:b + hash1:a;
hash1:c = hash2:c + hash1:b;
hash1:d = hash2:d + hash1:c;
hash1:e = hash2:e + hash1:d;
...

値またはキーが何であるかがわからないため、最初の方法を知っているかどうかさえよくわかりません。最初に並べ替える予定ですが、キーはリスト内の任意のキーになる可能性があるため、何が最初になるかを正確に指定できません。キーに基づいて以前の値を参照する方法がわかりません。これは可能ですか?

(私は恐れていることを示すコードを持っていません。試してみましたが、それは非常に間違っていることに気付きました笑)

4

2 に答える 2

5

ハッシュ自体は順序付けされていないため、「前の」キーはわかりません。関数を使用してキーを抽出し、keys(あなたが言ったように) 並べ替えてから、キーのリストの前の要素を参照して、選択した順序の前のキーが何であったかを調べる必要があります。

前のキーを取得したら、通常の$hash{$key}構文を使用してハッシュから値にアクセスできます。

トリックは、リスト内の前のキーにアクセスすることになります。foreachループでは、リスト内の現在の場所がわからないため、おそらくインデックスごとにリストを反復処理する必要があります。何かのようなもの

for (my $i = 0; $i <= $#keys; ++$i) {
    if ($i == 0) { ... } # first key
    else { ... } # all other keys
}

適切かもしれません。

于 2012-09-07T10:32:27.223 に答える
0

これは基本的に、すべてのハッシュ値の累積合計です。

a’ = (0) + a
b’ = (0  + a) + b
c’ = (0  + a  + b) + c
d’ = 0 + ...

ハッシュを反復処理し、合計を保存し、常に現在の値を追加する (または合計を現在の値に追加しても問題ありません。追加は交換可能です) と、目的の結果が得られます。ハッシュは定義上順序付けされていないため、最初にキーを並べ替える必要があることに注意してください。

$sum = 0;
foreach my $k (sort keys %hash) {
  $hash{$k} += $sum;
}

結果のハッシュもソートされないため、次の 2 つのオプションがあります。

  • ハッシュを操作する (反復する) たびに、ソートされたキーを反復処理してから、そのキー位置のハッシュにアクセスする必要があります。上記のループを使用して、その本体を必要なものと交換してください。
  • 合計をリスト/配列に保存します。これらのデータ構造は、値の順序を変更しません (ただし、キーと値のペアはなく、値のみです)。
于 2012-09-07T10:33:54.050 に答える