【问题标题】:Iterate through three values stored in two places遍历存储在两个地方的三个值
【发布时间】:2014-08-28 22:20:03
【问题描述】:

修改了一些。这是一个较大加工件的小样本。我的解谜逻辑需要检查一个人的五个属性之一和他的四个邻居的五个属性之一。此示例仅显示三个。在 $hash1 中,真值表,行是人,列是属性。我们假设管理属性 - 我将忽略该信息,因为它不是核心。

$hash1[2][2] 是一个“边”,所以它只需要检查一个邻居 $hash[6][value1]

$hash1[5][2] 是一个'中间',所以它需要检查两个邻居,$hash[3][value2] 和 $hash[9][value2]

$hash1 中的值是 9 表示 nil,1 表示真,0 表示假

所以,在这种情况下,“穿红衬衫的人住在开福特的人旁边”

如果我们要检查是否分配了红色衬衫,我们需要查看键 2、5、8。当逻辑命中 $hash1[5][2] 并且红色衬衫为 1 时,逻辑将检查一个邻居是否为零,而另一个邻居是否有一辆不是福特的汽车。如果为 true,则将 nil car 设置为 Ford。

 $hash1 = {1 => [9,9,9],  2 => [9,9,9],  3 => [9,9,9],
           4 => [9,9,9],  5 => [9,1,9],  6 => [9,9,9],
           7 => [9,9,9],  8 => [9,9,9],  9 => [9,9,1], 99 => [1,1,1]}

 $arry1 = [2,5,8]

 $hash2 = { 6 => 99, 3 => 9, 99 => 6}

(条目 99 允许代码使用与中间相同的边缘检查机制,因为如果是最后的那个人,那么他只有一个邻居,所以如果他有一件红衬衫,他的邻居肯定开福特。)

我需要它总共循环三遍:

checking 2 and 6 , 99
then     5 and 3 , 9
then     8 and 99 , 6

除了从两个不同的地方循环使用三个值外,我一切正常-我现在正在修补这个-

    $arry1.zip($hash2).map(&:flatten).each |key,key2,key3|

除了它正在做的是将它们合并到这个:

 <2, 6, 99> <5, 99, 6> <8>

对于更长的数组,相同的模式——第一个和最后一个哈希对进来并与前两个数组值配对,其余的数组值不变。

【问题讨论】:

  • 这很难理解,也更难测试,因为$hash 不完整。我建议您编辑以包含完整的$hash(越短越好)、缩短的name1eman1,以及您想要的输出。您还需要解释key3 是什么。不要改变你所拥有的;只需在末尾添加“Edit: ...”即可。
  • 嗨-是的,很抱歉。实际代码非常庞大......我并没有专注于我需要询问的内容 - 试图解释太多。

标签: ruby arrays loops hash


【解决方案1】:

假设你的代码是完整的,你应该可以替换:

val1.each do |key1|
  val2.each do |key2,key3|

val1.zip(val_2).map(&:flatten).each do |key1, key2, key3|

附加说明:当您解决完问题后,请将其发布到 codereview.stackexchange.com`,以便我们可以对气味进行处理。 :)

【讨论】:

  • 好一个。我不知道发生了什么。
  • 嗯。我收到一个错误:“语法错误,意外',',期待keyword_end”,它表示...|key1中的逗号后面的空格,
  • 哦,伙计!我试过了,但没有用,但那是在我尝试的其他十件事中——谢谢!哦……但它不起作用。它将第一个和最后一个 Hash 值与前两个数组值合并,并使其余的数组值没有伙伴。所以不是 [a1, h1, h2,] [a2, h3, h4, ][a3, h5, h6]... 我得到 [a1, h1, h2,][a2, h9, h10][a3] [a4][a5]
  • 这表明您的数组包含的元素比您压缩它的要多。
  • 您的哈希有重复的键 - 这是不允许的。只有最后一个值会出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2012-08-16
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多