2012-05-22 70 views
1

我一有相冊如下列表:自然排序

"Day 10 - Kblah" 
"Day 9 - Lblah" 
"Day 8 - Sblah" 
"Day 7 - Ublah" 
"Day 6 - Sblah" 
"Day 5 - Cblah" 
"Day 4 - Gblah" 
"Day 3 - Sblah" 
"Day 2 - Dblah" 
"Day 1 - Hblah" 
"Another album" 
"Some more albums" 

當我自己的頭銜對它們進行排序我結束了:

"Another album" 
"Day 1 - Hblah" 
"Day 10 - Kblah" 
"Day 2 - Dblah" 
"Day 3 - Sblah" 
"Day 4 - Gblah" 
"Day 5 - Cblah" 
"Day 6 - Sblah" 
"Day 7 - Ublah" 
"Day 8 - Sblah" 
"Day 9 - Lblah" 
"Some more albums" 

凡爲我想要他們是:

"Another album" 
"Day 1 - Hblah" 
"Day 2 - Dblah" 
"Day 3 - Sblah" 
"Day 4 - Gblah" 
"Day 5 - Cblah" 
"Day 6 - Sblah" 
"Day 7 - Ublah" 
"Day 8 - Sblah" 
"Day 9 - Lblah" 
"Day 10 - Kblah" 
"Some more albums" 

我基本上想自然排序的標題,但字母自然排序。有沒有任何類型的寶石能夠爲我正確地做到這一點?

親切的問候, 尼爾

回答

1

感謝您的回覆。我設法找到了創造奇蹟的寶石。它被稱爲NaturalSorter,我只是在我的控制器的@albums實例變量中調用它,按標題對它們進行排序,然後傳遞給視圖。

親切的問候, 尼爾

2

我不知道創業板會自動算出來。我想象一般來說解決這個問題是相當困難的。

但是,如果問題不是通用的,它可能是可行的。

它首先傳遞一個塊的排序:

array.sort do |a, b| 
    # return -1, 0 or 1 in this block, usually done via the <=> operator 
end 

你可能要離開了「日」的一部分:

DAY_REGEX = /^Day (\d+) -/ 

array.sort do |a, b| 
    if is_day?(a) && is_day(b) 
    value_of_day(a) <=> value_of_day(b) 
    else 
    a <=> b 
    end 
end 

def is_day?(str) 
    str =~ DAY_REGEX 
end 

def value_of_day(str) 
    DAY_REGEX.match(str)[1].to_i 
end 

我知道,這是哈克和醜陋。但是,如果你找不到合適的解決方案,我希望它能激發你如何自己解決這個問題。

編輯:也許改變技術讀取類似於:contains_numbers。 編寫一些測試來做這樣的事情:當字符串的部分直到第一個名字在兩個字符串中都是相同的,然後刪除這些字符串,轉換數字並對其進行排序。

1

您如何生成相冊名稱列表?你可以回到那一步,並在那裏進行排序嗎? (例如,它們是否從用戶相冊的數據庫表中抽取?)。或者將數組替換爲某種可排序索引的專輯名稱的散列,然後對這些鍵進行排序並按該順序從散列中檢索值。