2012-10-10 61 views
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]} 

和acheive

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

相反這個我正在尋找哈希狀排列

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

所以,在上面的列表中值的排序位置,在列表中我現在得到,但它也認爲鍵值以便這就是爲什麼第一個是汽車,然後將所有其它鍵,相同價值和奶油,然後爲

+0

'acemrs'是<'acrs',那麼爲什麼這兩個人會在你期望的結果中跟隨前兩個呢? – dbenhur

回答

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"]] 
+0

你的答案是有道理的,但你可以寫它更少混淆... –

+0

@JoshVoigts沒有什麼在我的片段混淆。這是以普通方式使用的普通紅寶石。 #sort,哈希成員作爲關鍵字,值對的產生,使用比較運算符<=>,以及鏈接到次要評估的三元組是非常平淡無奇的,並按照人們的期望使用。 – dbenhur

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

請試試這個..

ARR = [ '汽車', '對', 'RACS', '霜', '尖叫']

sw = Hash.new

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

ss = sw.sort_by {| key,value | [value [-1]]}。reversible e

#[[「cars」,「acrs」],[「racs」,「acrs」],[「scream」,「acemrs」],[「creams」,「acemrs」],[「for 「,」for「]]