0

我有一个像这样的数组:

'cars', 'for', 'racs', 'creams', 'scream'.

现在,我要做的是对这个数组中的每个单词/字符串进行排序,并将排序后的字符串作为值放入哈希中,而原始字符串是键。所以现在我有

KEYS - VALUES

cars - acrs
for - for
racs - acrs
creams - acemrs
scream - acemrs

代码是

sorted_words = Hash.new(0)
words.each { |word| sorted_words[word]=word.chars.sort { |a, b| a.casecmp(b) }.join
}

在此之后,我根据值对哈希进行排序

sorted_words = sorted_words.sort{|a1,a2| a1[1]<=>a2[1]}

并实现

scream - acemrs
creams - acemrs
racs - acrs
cars - acrs
for - for

而不是这个,我正在寻找像这样排列的哈希

cars - acrs
racs - acrs
creams - acemrs
scream - acemrs
for - for

所以,在上面的列表中,值在我现在得到的列表中的排序位置,但它也考虑了键值,所以这就是为什么首先是汽车,然后是具有相同值和奶油的所有其他键,然后是

4

3 回答 3

1

听起来您想使用打破平局的键对价值主要顺序进行排序。试试这样:

sorted_words = sorted_words.sort{|(k1,v1),(k2,v2)| vcmp = v1<=>v2; vcmp!=0 ? vcmp : k1<=>k2 }
# => [["creams", "acemrs"], ["scream", "acemrs"], ["cars", "acrs"], ["racs", "acrs"], ["for", "for"]]
于 2012-10-10T05:44:15.563 回答
0

请试试这个..

arr = ['汽车','for','racs','奶油','尖叫']

sw=Hash.new

mm=arr.each{|word|sw[word]=word.split(//).sort{|a,b|a.casecmp(b)}.join}

ss=sw.sort_by{|key,value|[value[-1]]}.reverse

# [["cars", "acrs"], ["racs", "acrs"], ["scream", "acemrs"], ["creams", "acemrs"], ["for", "for" ]]

于 2012-10-11T05:27:12.867 回答
0
Hash[
  array
  .map{|w| [w, w.chars.sort_by(&:downcase).join]}
  .sort_by{|k, v| [v, k]}
]
于 2012-10-10T07:38:01.023 回答