2013-07-12 2 views
8

मेरे पास दो हैश:मैं दो हैंश का चौराहे कैसे बना सकता हूं?

hash3 = {3 => "hello" , 4 => "world"} 

यह किसी भी पाश के बिना यह करने के लिए संभव है:

hash1 = {1 => "a" , 2 => "b" , 3 => "c" , 4 => "d"} 
hash2 = {3 => "hello", 4 => "world" , 5 => "welcome"} 

मैं एक हैश जो दोनों हैश में आम कुंजियां मौजूद ज़रूरत है?

+1

* * कोई। आप लूप का उपयोग क्यों नहीं करना चाहते हैं? – Shoe

+3

मुझे लगता है कि उसका मतलब है "लूप को कोडिंग किए बिना और कुछ अंतर्निहित विधि का उपयोग करें"। – Koraktor

+2

क्या आपको परवाह है कि मूल्य क्या हैं, या सिर्फ चाबियाँ दिए गए हैंश की चाबियों का अंतर है? –

उत्तर

12
hash3 = hash1.keep_if { |k, v| hash2.key? k } 

इस सवाल में कोड के रूप में ही प्रभाव नहीं होगा, बजाय इसे वापस आ जाएगी:

hash3 #=> { 3 => "c", 4 => "d" } 

हैश के आदेश यहाँ महत्वपूर्ण है। मान हमेशा हैश से लिया जाएगा कि #keep_if भेज दिया गया है।

hash3 = hash2.keep_if { |k, v| hash1.key? k } 
#=> {3 => "hello", 4 => "world"} 
+1

यह हैश 3 = {3 => "सी", 4 => "डी"} देता है लेकिन उपयोगकर्ता की आवश्यकता है- हैश 3 = {3 => "हैलो", 4 => "दुनिया"} –

+0

मेरा संपादित उत्तर देखें। – Koraktor

+0

हाँ अब यह आपके उत्तर के लिए –

9

मैं इस के साथ जाना चाहते हैं:

hash1 = {1 => "a" , 2 => "b" , 3 => "c" , 4 => "d"} 
hash2 = {3 => "hello", 4 => "world" , 5 => "welcome"} 

Hash[(hash1.keys & hash2.keys).zip(hash2.values_at(*(hash1.keys & hash2.keys)))] 
=> {3=>"hello", 4=>"world"} 

कौन सा करने के लिए थोड़ा कम किया जा सकता:

keys = (hash1.keys & hash2.keys) 
Hash[keys.zip(hash2.values_at(*keys))] 

चाल है सरणी के & विधि में। दस्तावेज़ीकरण कहता है:

सेट छेड़छाड़ - किसी भी डुप्लीकेट को छोड़कर, दो सरणी के लिए सामान्य तत्वों वाली एक नई सरणी देता है। ऑर्डर मूल सरणी से संरक्षित है।

require 'benchmark' 

HASH1 = {1 => "a" , 2 => "b" , 3 => "c" , 4 => "d"} 
HASH2 = {3 => "hello", 4 => "world" , 5 => "welcome"} 

def tinman 
    keys = (HASH1.keys & HASH2.keys) 
    Hash[keys.zip(HASH2.values_at(*keys))] 
end 

def santhosh 
    HASH2.select {|key, value| HASH1.has_key? key } 
end 
def santhosh_2 
    HASH2.select {|key, value| HASH1[key] } 
end 

def priti 
    HASH2.select{|k,v| HASH1.assoc(k) } 
end 

def koraktor 
    HASH1.keep_if { |k, v| HASH2.key? k } 
end 
def koraktor2 
    HASH2.keep_if { |k, v| HASH1.key? k } 
end 

N = 1_000_000 
puts RUBY_VERSION 
puts "N= #{N}" 

puts [:tinman, :santhosh, :santhosh_2, :priti, :koraktor, :koraktor2].map{ |s| "#{s.to_s} = #{send(s)}" } 
Benchmark.bm(11) do |x| 
    x.report('tinman') { N.times { tinman() }} 
    x.report('santhosh_2') { N.times { santhosh_2() }} 
    x.report('santhosh') { N.times { santhosh() }} 
    x.report('priti') { N.times { priti() }} 
    x.report('koraktor') { N.times { koraktor() }} 
    x.report('koraktor2') { N.times { koraktor2() }} 
end 

रूबी 1.9.3-p448:

1.9.3 
N= 1000000 
tinman = {3=>"hello", 4=>"world"} 
santhosh = {3=>"hello", 4=>"world"} 
santhosh_2 = {3=>"hello", 4=>"world"} 
priti = {3=>"hello", 4=>"world"} 
koraktor = {3=>"c", 4=>"d"} 
koraktor2 = {3=>"hello", 4=>"world"} 
        user  system  total  real 
tinman  2.430000 0.000000 2.430000 ( 2.430030) 
santhosh_2 1.000000 0.020000 1.020000 ( 1.003635) 
santhosh  1.090000 0.010000 1.100000 ( 1.104067) 
priti   1.350000 0.000000 1.350000 ( 1.352476) 
koraktor  0.490000 0.000000 0.490000 ( 0.484686) 
koraktor2  0.480000 0.000000 0.480000 ( 0.483327) 

रूबी 2.0 के तहत चल रहा है


यहाँ यह करने के लिए सबसे कारगर तरीका है क्या दिखाने के लिए कुछ मानक हैं .0-पी 247:

2.0.0 
N= 1000000 
tinman = {3=>"hello", 4=>"world"} 
santhosh = {3=>"hello", 4=>"world"} 
santhosh_2 = {3=>"hello", 4=>"world"} 
priti = {3=>"hello", 4=>"world"} 
koraktor = {3=>"c", 4=>"d"} 
koraktor2 = {3=>"hello", 4=>"world"} 
        user  system  total  real 
tinman  1.890000 0.000000 1.890000 ( 1.882352) 
santhosh_2 0.710000 0.010000 0.720000 ( 0.735830) 
santhosh  0.790000 0.020000 0.810000 ( 0.807413) 
priti   1.030000 0.010000 1.040000 ( 1.030018) 
koraktor  0.390000 0.000000 0.390000 ( 0.389431) 
koraktor2  0.390000 0.000000 0.390000 ( 0.389072) 

कोरकटर का मूल कोड काम नहीं करता है, लेकिन उसने इसे अपने दूसरे कोड पास के साथ अच्छी तरह से बदल दिया, और सबसे अच्छी गति से दूर चला गया। key? को हटाने के प्रभाव को देखने के लिए मैंने santhosh_2 विधि को जोड़ा। यह नियमित रूप से थोड़ी देर तक फैल गया, लेकिन कोरकटर तक पहुंचने के लिए पर्याप्त नहीं था।


बस प्रलेखन प्रयोजनों के लिए, मैं Koraktor की दूसरी कोड फेरबदल भी key? पद्धति निकालना, और यह से अधिक समय के बाल काटे। यहाँ जोड़ा विधि और नई उत्पादन है: किसी भी पाश के बिना

def koraktor3 
    HASH2.keep_if { |k, v| HASH1[k] } 
end 

1.9.3 
N= 1000000 
tinman = {3=>"hello", 4=>"world"} 
santhosh = {3=>"hello", 4=>"world"} 
santhosh_2 = {3=>"hello", 4=>"world"} 
priti = {3=>"hello", 4=>"world"} 
koraktor = {3=>"c", 4=>"d"} 
koraktor2 = {3=>"hello", 4=>"world"} 
koraktor3 = {3=>"hello", 4=>"world"} 
        user  system  total  real 
tinman  2.380000 0.000000 2.380000 ( 2.382392) 
santhosh_2 0.970000 0.020000 0.990000 ( 0.976672) 
santhosh  1.070000 0.010000 1.080000 ( 1.078397) 
priti   1.320000 0.000000 1.320000 ( 1.318652) 
koraktor  0.480000 0.000000 0.480000 ( 0.488613) 
koraktor2  0.490000 0.000000 0.490000 ( 0.490099) 
koraktor3  0.390000 0.000000 0.390000 ( 0.389386) 

2.0.0 
N= 1000000 
tinman = {3=>"hello", 4=>"world"} 
santhosh = {3=>"hello", 4=>"world"} 
santhosh_2 = {3=>"hello", 4=>"world"} 
priti = {3=>"hello", 4=>"world"} 
koraktor = {3=>"c", 4=>"d"} 
koraktor2 = {3=>"hello", 4=>"world"} 
koraktor3 = {3=>"hello", 4=>"world"} 
        user  system  total  real 
tinman  1.840000 0.000000 1.840000 ( 1.832491) 
santhosh_2 0.720000 0.010000 0.730000 ( 0.737737) 
santhosh  0.780000 0.020000 0.800000 ( 0.801619) 
priti   1.040000 0.010000 1.050000 ( 1.044588) 
koraktor  0.390000 0.000000 0.390000 ( 0.387265) 
koraktor2  0.390000 0.000000 0.390000 ( 0.388648) 
koraktor3  0.320000 0.000000 0.320000 ( 0.327859) 
+0

Thanx काम करता है, यह काम करता है ........ – user2575339

+0

धन्यवाद। बेंचमार्क देखें। उपयोगकर्ता 2564200 का कोड, मामूली चिमटा के साथ, सबसे तेज़ है। –

+0

कोरेटर सबसे तेज़ है। बेंचमार्क लिखने के बाद आपने अपना कोड बदल दिया, इसलिए, जबकि आपका अब 'हैश []' का उपयोग करके प्रतिबिंबित करता है, लेकिन मूल रूप से संपादन इतिहास में प्रमाणित रूप से 'assoc' का उपयोग किया जाता है। –

8
hash2.select {|key, value| hash1.has_key? key } 
# => {3=>"hello", 4=>"world"} 
+1

यह इस साइट पर कभी देखा गया सबसे सुंदर समाधान है। – Fuser97381

संबंधित मुद्दे