1

我有一个非常具体的要求。有相同的三个或四个衬垫解决方案。我需要一种衬垫解决方案。

假设我有一个像这样的数组:

[["Andorra", "Andorra"], ["United Arab Emirates", "United Arab Emirates"], 
 ["Afghanistan", "Afghanistan"], ["Antigua & Barbuda", "Antigua & Barbuda"], 
 ["Anguilla", "Anguilla"], ["Albania", "Albania"], ["Armenia", "Armenia"], 
 ["Angola", "Angola"]]

我希望 ["Anguilla", "Anguilla"] 作为我的第一个元素,其他元素按降序排列。

有没有办法做到这一点?(如果可能的话,一个班轮)

4

4 回答 4

6

利用数组定义的字典顺序并按所需标准对输入进行排序:

countries.sort_by { |s, s2| [s == "Anguilla" ? 1 : 0, s] }.reverse
#=> [["Anguilla", "Anguilla"], ..., ["Afghanistan", "Afghanistan"]]

@Sergio 建议使用Enumerable#sort来避免reverse. IMO 它的声明性不如前者,但为了记录,这就是它的外观:

countries.sort { |(s1, _), (s2, _)| s1 == "Anguilla" ? -1 : s2 <=> s1 }
#=> [["Anguilla", "Anguilla"], ..., ["Afghanistan", "Afghanistan"]]
于 2013-01-22T12:13:52.787 回答
4

这是你的单线:

countries = [["Andorra", "Andorra"], ["United Arab Emirates", "United Arab Emirates"], ["Afghanistan", "Afghanistan"], ["Antigua & Barbuda", "Antigua & Barbuda"], ["Anguilla", "Anguilla"], ["Albania", "Albania"], ["Armenia", "Armenia"], ["Angola", "Angola"]]

custom_order = countries.partition{|arr| arr[0] == "Anguilla"}.map(&:sort).map(&:reverse).flatten(1)
custom_order # => [["Anguilla", "Anguilla"], ["United Arab Emirates", "United Arab Emirates"], ["Armenia", "Armenia"], ["Antigua & Barbuda", "Antigua & Barbuda"], ["Angola", "Angola"], ["Andorra", "Andorra"], ["Albania", "Albania"], ["Afghanistan", "Afghanistan"]]

这是一个替代解决方案:

custom_order = countries.sort do |c1, c2|
  if c1[0] == 'Anguilla'
    -1
  else
    c2 <=> c1
  end
end
于 2013-01-22T11:40:49.500 回答
0

有点原始,但是一行:

[["Anguilla", "Anguilla"]] << ([["Andorra", "Andorra"], ["United Arab Emirates", "United Arab Emirates"], ["Afghanistan", "Afghanistan"], ["Antigua & Barbuda", "Antigua & Barbuda"], ["Anguilla", "Anguilla"], ["Albania", "Albania"], ["Armenia", "Armenia"], ["Angola", "Angola"]] - ["Anguilla", "Anguilla"]).sort{|a,b| b[0] <=> a[0]}
于 2013-01-22T11:42:11.923 回答
0

尝试这个:

[["Andorra", "Andorra"], ["United Arab Emirates", "United Arab Emirates"], ["Afghanistan", "Afghanistan"], ["Antigua & Barbuda", "Antigua & Barbuda"], ["Anguilla", "Anguilla"], ["Albania", "Albania"], ["Armenia", "Armenia"], ["Angola", "Angola"]].sort{|a,b| b[0] <=> a[0]}.partition{|arr| arr[0] == "Anguilla"}
于 2013-01-22T11:51:24.127 回答