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"

我基本上想对标题进行自然排序,但要按字母自然排序。是否有任何类型的宝石可以为我正确执行此操作?

亲切的问候,尼尔

4

3 回答 3

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. 编写一些测试来执行以下操作:当字符串中直到名字的部分在两个字符串中相同时,然后删除它们,转换数字并对其进行排序。

于 2012-05-22T22:31:56.530 回答
1

感谢您的回复。我设法找到了一个创造奇迹的宝石。它被称为 NaturalSorter,我只是在我的控制器中的 @albums 实例变量上调用它以按标题对它们进行排序,然后将其传递给视图。

亲切的问候,尼尔

于 2012-05-23T10:10:45.483 回答
1

您如何生成相册名称列表?你能回到那个步骤并在那里计算排序吗?(例如,它们是从用户相册的数据库表中提取的吗?)。或者用可以排序的东西索引的专辑名称的散列替换数组,然后对键进行排序并按该顺序从散列中检索值。

于 2012-05-23T06:15:10.207 回答