2013-12-10 2 views
1

У меня есть двумерный массив, который имеет следующую структурурубин два двумерный массив сортировки на основе первого элемента

a = [["5/2013", 20.0, 6.0, 6.0], 
["7/2013", 73.0, 66.0, 66.0], 
["50/2013", 11530.0, 12625.27, 12087.75], 
["2/2014", 5926.0, 6058.0, 5876.4], 
["3/2013", 15.0, 0.0, 0.0], 
["4/2013", 15.0, 0.0, 0.0]] 

Я хочу, чтобы отсортировать массив на основе первого элемента, первый элемент каждого массива не представляет неделю не в год (т.е. «2/2014» означает 2-ю неделю в 2014 году, что больше, чем «50/2013») результат будет как этот

["3/2013", 15.0, 0.0, 0.0], 
["4/2013", 15.0, 0.0, 0.0], 
["5/2013", 20.0, 6.0, 6.0], 
["7/2013", 73.0, 66.0, 66.0], 
["50/2013", 11530.0, 12625.27, 12087.75], 
["2/2014", 5926.0, 6058.0, 5876.4], 
] 

Я попытался с этим одним

a.sort{|a,b| a[0].split('/')[1].to_i <=> b[0].split('/')[1].to_i && a[0].split('/') [0].to_i <=> b[0].split('/')[0].to_i} 

но это не поможет. Я новичок в рубинах и рельсах. Может ли кто-нибудь помочь мне решить мою проблему.

+0

Если вы сортируете как есть, '' 2/2014 "' должно прийти первым, а '7/2013" должно быть последним, в отличие от того, что у вас есть (отклонение факта, что ожидаемый результат недействителен Ruby выражение вообще). Ваш вопрос как есть противоречивый. – sawa

+0

Это не, @sawa. Создатель вопроса, похоже, хочет, чтобы вещи были заказаны, как если бы они находились там, где месяцы этого года. – paradoja

+1

'' 50/2013 "' ошибка или 50 означает неделю года? – benjaminjosephw

ответ

6
a.sort_by {|i| i.first.split('/').map(&:to_i).reverse } 

#[ 
# ["3/2013", 15.0, 0.0, 0.0], 
# ["4/2013", 15.0, 0.0, 0.0], 
# ["5/2013", 20.0, 6.0, 6.0], 
# ["7/2013", 73.0, 66.0, 66.0], 
# ["50/2013", 11530.0, 12625.27, 12087.75], 
# ["2/2014", 5926.0, 6058.0, 5876.4] 
#] 
+0

Спасибо. Это точно ответ, который я смотрел. –

+0

Довольно круто, но каково точное значение '&: to_i' в методе карты? –

+2

@LeoHuang '&: to_i' является ярлыком для' {| x | x.to_i} '. Это даст вам больше информации http://stackoverflow.com/questions/1217088/what-does-ampersand-colon-pretzel-colon-mean-in-ruby – Santhosh

1

Предполагая, что вы правильно сформированный первый элемент, то есть Date.parse не будет поднимать какие-либо исключения, используйте следующий

>> array = [["5/2013", 20.0, 6.0, 6.0], ["7/2013", 73.0, 66.0, 66.0], ["50/2013", 11530.0, 12625.27, 12087.75], ["2/2014", 5926.0, 6058.0, 5876.4], ["3/2013", 15.0, 0.0, 0.0], ["4/2013", 15.0, 0.0, 0.0]] 
>> array.sort_by { |date, _| Date.parse(date) } 

Для обработки неправильно сформированную дату, как 50/2013 (в вашем вопросе), вам нужно решить, по умолчанию стоимость. Допустим, вы хотите, чтобы установить значение по умолчанию на сегодняшнюю дату, изменить вторую строку в

>> array.sort_by { |date, _| Date.parse(date) rescue Date.today} 

EDIT

я предположил, что первый элемент подобен дате. Глядя на ваш вопрос, второй раз заставляет меня думать, что это не дата. Если это не дата, я должен согласиться с комментарием Пиши. Если вы действительно хотите, чтобы разобраться в этом, хотя, используйте следующие

array.sort do |a,b| 
    num1, year1 = a[0].split('/') 
    num2, year2 = b[0].split('/') 

    if year1 == year2 
    num1.to_i <=> num2.to_i 
    else 
    year1.to_i <=> year2.to_i 
    end 
end 

EDIT игнорировать большой метод выше, используйте ответ SANTOSH в.

+0

Спасибо. Фактически к 50/2013 я имею в виду неделю года –

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