2012-05-22 69 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

您如何生成相册名称列表?你可以回到那一步,并在那里进行排序吗? (例如,它们是否从用户相册的数据库表中抽取?)。或者将数组替换为某种可排序索引的专辑名称的散列,然后对这些键进行排序并按该顺序从散列中检索值。