1

非常に具体的な要件があります。同じための3つまたは4つのライナーソリューションがあります。ライナーソリューションが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"]を最初の要素として、その他を降順で表示したいと思います。

これを達成する方法はありますか?(可能であれば1つのライナー)

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

少し原始的ですが、1行:

[["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 に答える