2014-09-20 51 views
0

我有一個包含名字和日期的二維數組:如何找到元素的索引在二維散

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關聯的入場日期。這意味着索引的子數組需要患者的姓名和入院日期在收集日期之前,但如果在收集日期之前有多個入院日期的入口,也最接近收集日期。我希望這是有道理的。

例如,如果收集日期是9/3/14,我需要返回子數組[John Doe, 8/9/14]而不是[John Doe, 5/2/14]的索引,因爲第一個包含與該收集相關的入場日期(實驗室在收集他)。顯然只是要求collection_date大於入學日期,dt,是不夠的。

+0

你給了兩個標準的內部「維度,該塊返回true它將返回興田第一項的索引「。外部「維度」的標準是什麼? – sawa 2014-09-20 03:47:48

+0

通過在「我想查找條目索引」中使用複數形式,您意味着您正在查找可能多於一個條目(子數組)。但是你寫了你想讓return成爲單個對象'0'。當有多個比賽時會發生什麼? – sawa 2014-09-20 03:52:05

+0

您寫過條件以'patient_name'和'admission_date'命名。發生了什麼事,爲什麼使用'== John Doe&> 8/9/14'? – sawa 2014-09-20 04:01:10

回答

1

您可以在塊中使用Array#index

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] 
+0

#2的變體:'name_date_array.size.times.select do | i |名稱,sdate = name_date_array [i]; name =='John Doe'&&(sdate.split('/')。rotate(-1).map(&:to_i)<=> [14,8,9])< 0; end # => [3]'。 – 2014-09-20 04:09:15

+0

謝謝你,我不知道爲什麼我在其他地方找不到它,但它似乎工作!你是最好的! – 2014-09-21 00:29:55

相關問題