如何获取具有多个值的索引但返回单个结果

时间:2015-03-05 23:40:15

标签: ruby indexing ruby-1.8.7

我有两个数组:

expected = ["a", "b", "c", "d", "e", "f", "g"]
actual = ["a", "b", "c", "d", "d", "g", "g"]

我把两个都转换成了这样的字符串:

expected1 = "a,b,c,d,e,f,g"
actual1 = "a,b,c,d,d,g,g"

如果它们相同,我会比较每个值,例如:expected1[0] == actual1[0]expected1[1] == actual[1]等等。如果它们不相同,我想从实际中获取文件的索引。在这种情况下,它在expected1[4]actual[4]上不相等,因为值为"e""d"

我做了actual1.index(actual[4]),但由于值为"d",因此会返回第一个结果。我希望返回值为"8",但由于存在第一个"d",因此会返回"6"的值。

有没有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

我不确定为什么此时将数组转换为字符串。如果你在它们仍处于数组形式时进行了这种比较,你可以做这样的事情,如果你想要返回第一个不匹配的值:

actual.each_with_index |char, idx|
  if char != expected1[idx]
    return idx
  end
end

如果您想要返回不匹配值的列表,您可以执行以下操作:

wrong_value_indices = []

actual.each_with_index |char, idx|
  if char != expected1[idx]
    wrong_value_indices << idx
  end
end

return wrong_values_indices

&#39;返回&#39;当然是可选的。这可能不是完美的Ruby风格,但它应该有助于说明解决方案模式。 Here是Enumerable#each_with_index文档的链接。希望这有帮助!

编辑:在字符串形式中,您可以拥有外部索引。再一次,我知道这是一个非常符合玩具的代码,但如果您只是想要解决您所要求的问题......

idx = 0
actual1.each_char |char|
  if char != expected1[idx]
    return idx
  end
  idx += 1
end

wrong_value_indices = []

idx = 0
actual.each_char |char|
  if char != expected1[idx]
    wrong_value_indices << idx
  end
  idx += 1
end

return wrong_values_indices

答案 1 :(得分:1)

经过进一步研究,下面的代码有效:

diff = []

actual[row_num].join(",").scan(actual[row_num][col_num]) do |c|

  diff << [c, Regexp.last_match.offset(0).first]   

end

我将此应用于我的代码逻辑。我首先使用JOIN(包括逗号)将Array转换为String。并扫描每个ROW&amp;列中。

然后我将每个结果称为 diff.last [1] ,以获得准确的INDEX。

希望这可以帮助某人和我的问题一样。