【问题标题】:How to find the index of element in two dimensional hash如何在二维哈希中找到元素的索引
【发布时间】:2014-09-20 03:04:55
【问题描述】:

我有一个包含姓名和日期的二维数组:

name_date_array = [[John Doe, 8/9/14], [Jane Smith, 9/4/14], [Mary Jane, 6/5/14],
[John Doe, 5/2/14]]

(我正在重写,因为不清楚)我有两个变量:patient_namecollection_date。我试图找到包含patient_name 和小于“collection_date”的日期的子数组的索引。这是我从 falsetru 得到的:

patient_name = browser.find_element(:xpath => ".//*[@id='dialog-modal-cancel-hl7-preview']/table/tbody/tr[2]/td[1]").text

collected_date = browser.find_element(:xpath => ".//*[@id='dialog-modal-cancel-hl7-preview']/table/tbody/tr[2]/td[4]").text
mo, da, yr = collected_date.split('/').map(&:to_i)
cd = [yr, mo, da]

name_admit_array.index { |name, date|
    m, d, y = date.split('/').map(&:to_i)
    dt = [y, m, d]
    name == patient_name and (dt <=> cd)<0
}

这很好用,但我重写它的原因(除了为了挽回面子,因为它之前写得很糟糕)是我还有另一个问题。 collection_date 是为特定客户 (patient_name) 收集实验室样本的日期。每个子阵列包含患者姓名和入院日期。如果患者不止一次是患者,则患者可以有多个名称相同但入院日期不同的条目。

我需要找到包含paitient_name 并包含与collection_date 关联的录取日期的子数组的索引。这意味着索引的子数组需要具有患者姓名和在收集日期之前的入院日期,但如果有多个条目的入院日期在收集日期之前,则还需要最接近收集日期。我希望这是有道理的。

例如,如果收集日期是 2014 年 9 月 3 日,我需要返回子数组的索引 [John Doe, 8/9/14] 而不是 [John Doe, 5/2/14],因为第一个包含与该收集相关联的入场日期(逗留期间实验室是从他那里收集的)。显然,仅仅要求collection_date 大于录取日期dt 是不够的。

【问题讨论】:

  • 您为内部“维度”提供了两个标准。外部“维度”的标准是什么?
  • 您在“我想查找条目的索引”中使用复数表示您正在寻找可能不止一个条目(子数组)。但是您写道,您希望返回是单个对象0。当匹配不止一场时会发生什么?
  • 您写道,标准以patient_nameadmission_date 给出。这是怎么回事,为什么使用==John Doe &amp; &gt;8/9/14
  • 只有一个条目应该返回,所以我对“条目”的使用是错误的,对此感到抱歉。当我输入 ==John Doe & >8/9/14 时,我指的是 patient_name 和 admission_date 将等于什么。正如我所说,这是我第一次尝试编程,我仍在逐行学习。
  • 您的答案已被接受。要提出新问题,您应该提出新问题,而不是编辑当前问题。您可以在新问题中从此处复制或参考材料。

标签: ruby arrays indexing multidimensional-array


【解决方案1】:

您可以将Array#index 与块一起使用。它将返回块返回的第一个项目的索引true

name_date_array = [
  ['John Doe', '8/9/14'],
  ['Jane Smith', '9/4/14'],
  ['Mary Jane', '6/5/14'],
  ['John Doe', '5/2/14']
]

name_date_array.index { |name, date|
  m, d, y = date.split('/').map(&:to_i)
  dt = [y, m, d]
  name == 'John Doe' and (dt <=> [14, 8, 9]) < 0
}
# => 3

如果要获取多个索引(Enumerable#each_with_indexEnumerable#select):

name_date_array.each_with_index.select { |(name, date), i|
  m, d, y = date.split('/').map(&:to_i)
  dt = [y, m, d]
  name == 'John Doe' and (dt <=> [14, 8, 9]) < 0
}.map { |x, i| i }
# => [3]

【讨论】:

  • #2 的变体:name_date_array.size.times.select do |i| name, sdate = name_date_array[i]; name == 'John Doe' &amp;&amp; (sdate.split('/').rotate(-1).map(&amp;:to_i) &lt;=&gt; [14, 8, 9]) &lt; 0; end # =&gt; [3].
  • 谢谢你,我不知道为什么我在别处找不到这个,但它似乎工作!你是最棒的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2018-11-12
  • 1970-01-01
  • 2022-11-19
  • 2020-06-16
  • 2020-06-30
相关资源
最近更新 更多