基于哈希值排序而不忽略键

时间:2012-10-10 01:35:20

标签: ruby

我有一个像:

这样的数组
'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

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

3 个答案:

答案 0 :(得分: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"]]

答案 1 :(得分:0)

Hash[
  array
  .map{|w| [w, w.chars.sort_by(&:downcase).join]}
  .sort_by{|k, v| [v, k]}
]

答案 2 :(得分:0)

请试试这个..

arr = ['cars','for','racs','creams','scream']

SW = Hash.new

毫米= arr.each {|字| SW [字] = word.split(//)排序{| A,B |。a.casecmp(b)中加入}}

SS = sw.sort_by {|键,值| [值[-1]]}。逆转

#[[“cars”,“acrs”],[“racs”,“acrs”],[“scream”,“acemrs”],[“creams”,“acemrs”],[“for”, “为”]]