2014-09-20 4 views
0

У меня есть массив 2D, содержащий имена и даты:Как найти индекс элемента в двухмерном хэш

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

(я переписывания это, как это было неясно) У меня есть две переменные: patient_name и collection_date. Я пытаюсь найти индекс sub-array, содержащий 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. Это означает, что индексируемая подгруппа должна иметь имя пациента и дату приема, которая находится до набранной даты, но также ближе всего к собранной дате, если есть более одной записи с датами приема до даты сбора. Я надеюсь, что в этом есть смысл.

Например, если дата сбора 9/3/14, мне нужно вернуть индекс вспомогательной матрицы [John Doe, 8/9/14], а не [John Doe, 5/2/14], поскольку первая содержит дату приема, связанную с этой коллекцией (время пребывания, в течение которого лаборатория была собранных у него). Ясно, что просто требуется, чтобы collection_date больше, чем дата приема, dt, недостаточно.

+0

Вы дали два критерия для внутреннего «измерение «. Каков критерий внешнего «измерения»? – sawa

+0

Пользуясь множественным числом в «Я хочу найти индекс записей», вы подразумеваете, что вы ищете возможно более одной записи (подматрица). Но вы написали, что хотите, чтобы возврат был единственным объектом '0'. Что происходит, когда есть более одного матча? – sawa

+0

Вы написали, что критерии задаются как 'patient_name' и' admission_date'. Что случилось с этим, и почему используется '== John Doe &> 8/9/14'? – sawa

ответ

1

Вы можете использовать Array#index с блоком. Она возвращает индекс Hte первого элемента, для которого блок возвращается 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_index, Enumerable#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] 
+0

Вариант # 2: 'name_date_array.size.times.select do | i | name, sdate = name_date_array [i]; name == 'John Doe' && (sdate.split ('/'). rotate (-1) .map (&: to_i) <=> [14, 8, 9]) < 0; end # => [3] '. –

+0

Спасибо за это, я не знаю, почему я не мог найти это в другом месте, но он работает! Ты лучший! –

Смежные вопросы