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

生成的哈希也不会被排序,因此您有两个选择:

  • 每次使用散列(对其进行迭代)时,您都必须遍历已排序的键,然后在该键位置访问散列。只需使用我上面给出的循环,然后用你想要的任何东西交换它的主体。
  • 将总和存储在列表/数组中。这些数据结构不会更改它们的值顺序(但您不会有键值对;只有值)。
于 2012-09-07T10:33:54.050 回答