Project1
标题:
Addition of hash(Ruby)[finish]
[打印本页]
作者:
枫起
时间:
2011-7-30 20:08
标题:
Addition of hash(Ruby)[finish]
本帖最后由 忧雪の伤 于 2012-1-24 19:15 编辑
标题
添加一个哈希相加的方法。(Ruby)
描述
如题所见,提个醒,是要增加方法,不要实例操作……
要求
提供异常报告解决方案,对于相同的key就取自身的。
参考答案
display line
作者:
fux2
时间:
2011-7-30 22:11
本帖最后由 fux2 于 2011-7-30 23:45 编辑
class Hash
def +(exhash)
return unless exhash.is_a?(Hash)
shash = self.dup
exhash.each_key {|k| shash[k]||=exhash[k]}
shash
end
end
复制代码
作者:
忧雪の伤
时间:
2011-7-30 22:14
本帖最后由 忧雪の伤 于 2011-7-30 22:17 编辑
fux2 发表于 2011-7-30 22:11
提供异常报告解决方案
=> false
对于相同的key就取自身的
=> false
other : 那个,直接赋值岂不是指针相同。
作者:
px.凤翔九天
时间:
2011-7-30 22:25
本帖最后由 px.凤翔九天 于 2011-7-31 19:20 编辑
h1,h2={1=>2,3=>4},{5=>6,7=>8}
def hash_add(hash1,hash2)
unless hash1.is_a?(Hash) and hash2.is_a?(Hash)
return "这货不是Hash,拉出去处理了!"
end
hash3={}
hash1.each{|key,value| key_add,value_add=key,value
hash2.each{|key2,value2|
key_add+=key2 unless key2==key
value_add+=value2 unless value2==value
}
hash3[key_add]=value_add}
return hash3
end
p hash_add(h1,h2)
复制代码
貌似
提供异常报告解决方案
贯彻不够......不过结果应该对吧.....
P.S. 对于没有定义在Hash中表示悔改......
0.0这个加法吗....................囧,彻底理解错了嗷..............
作者:
fux2
时间:
2011-7-30 22:26
忧雪の伤 发表于 2011-7-30 22:14
=> false
=> false
你没试过就知道:对于相同的key就取自身的 == false?
作者:
枫起
时间:
2011-7-30 22:47
本帖最后由 忧雪の伤 于 2011-7-31 14:37 编辑
最初的思路是:先将hash表B进行迭代,然后输入到A里面,最后判断A里面是否有相同的,如果有就删除重复的。
但是后来发现不知道怎么输入到A里面。。。接着查镐头书的时候查到了“merge!”方法。它简直就是为这个问题量身打造的,merge!的定义:合并A与B两个数组,最后删除重复的。
有点不服气的感觉啊。。。毕竟是直接查到了方法- -
另外因为小LOLI不让给实例。。。所以就拿a = hash.new意思了一下。。。本来是有非常有趣的hash表的。。。TAT
我有此次事件知道了。。。必须多写代码。。。多熟悉方法啊。。。这玩意不懂方法没法做啊。。。
a = {}
b = {}
a['q'] = 1
a['w'] = 2
b['e'] = 3
b['q'] = 1
begin
a.merge!(b)
print a
rescue TypeError
print "Error for hash type"
end
复制代码
写过了版本。。。真心表示很蛋疼。。。很纠结。。。
最后在月妹妹的帮助下。。。帮我在我的错误版本的基础上修改了下。。。虽然不能算是自己做的。。。但是也算是长知识了。。。
a = {'q'=>1,'w'=>2,'e'=>3}
b = {'w'=>2,'r'=>4,'t'=>5}
c = {}
class Hash
def hashadd(h1,h2)
raise TypeError unless h1.is_a?(Hash) and h2.is_a?(Hash)
h = {}
h1.each {
| key,value |
h[key] = value unless h.has_key?(key)
}
h2.each {
| key,value |
h[key] = value unless h.has_key?(key)
}
return h
end
end
c = c.hashadd(a,b)
p c
复制代码
作者:
DeathKing
时间:
2011-7-31 09:44
之前的方法跟fux给撞上了……所以换了种,
不过慢了许多
~
class Hash
def hplus( hash )
raise TypeError unless hash.is_a?( Hash )
nhash = {}
keys = self.keys | hash.keys
keys.each do |k|
nhash[k] = self[k] || hash[k]
end
return nhash
end
end
复制代码
测试代码:
# test
# except { 1=>2, 2=>4, 3=>4, 5=>6, 7=>8}
a = {1=>2, 3=>4, 5=>6}
b = {1=>3, 2=>4, 3=>4, 7=>8}
puts a.hplus(b)
#=> {1=>2, 3=>4, 5=>6, 2=>4, 7=>8}
复制代码
Benchmark跑10,000次a.hplus(b)。
Rehearsal ------------------------------------
0.156000 0.016000 0.172000 ( 0.171875)
--------------------------- total: 0.172000sec
user system total real
0.188000 0.000000 0.188000 ( 0.203125)
复制代码
作者:
退屈£无聊
时间:
2011-7-31 10:16
本帖最后由 退屈£无聊 于 2011-7-31 10:19 编辑
class Hash
def add(new)
return unless new.is_a?(hash)
new.each_key do |key|
unless self[key].nil?
#self[key] = [self[key], new[key]]
else
self[key] = new[key]
end
end
return self
end
end
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1