如何在ruby哈希中检查匹配的键?
我正在学习编码,其中一个任务是返回键,返回喜欢同一个电视节目的人的名字 我已经设法让它工作并通过了TDD,但我想知道我是否已经走了“很长的路”,也许有一个更简单的解决方案 以下是设置和测试:如何在ruby哈希中检查匹配的键?,ruby,hash,Ruby,Hash,我正在学习编码,其中一个任务是返回键,返回喜欢同一个电视节目的人的名字 我已经设法让它工作并通过了TDD,但我想知道我是否已经走了“很长的路”,也许有一个更简单的解决方案 以下是设置和测试: class TestFriends < MiniTest::Test def setup @person1 = { name: "Rick", age: 12, monies: 1, friends: ["Jay","Keith","Da
class TestFriends < MiniTest::Test
def setup
@person1 = {
name: "Rick",
age: 12,
monies: 1,
friends: ["Jay","Keith","Dave", "Val"],
favourites: {
tv_show: "Friends",
things_to_eat: ["charcuterie"]
}
}
@person2 = {
name: "Jay",
age: 15,
monies: 2,
friends: ["Keith"],
favourites: {
tv_show: "Friends",
things_to_eat: ["soup","bread"]
}
}
@person3 = {
name: "Val",
age: 18,
monies: 20,
friends: ["Rick", "Jay"],
favourites: {
tv_show: "Pokemon",
things_to_eat: ["ratatouille", "stew"]
}
}
@people = [@person1, @person2, @person3]
end
def test_shared_tv_shows
expected = ["Rick", "Jay"]
actual = tv_show(@people)
assert_equal(expected, actual)
end
end
classtestfriends
以下是我找到的解决方案:
def tv_show(people_list)
tv_friends = {}
for person in people_list
if tv_friends.key?(person[:favourites][:tv_show]) == false
tv_friends[person[:favourites][:tv_show]] = [person[:name]]
else
tv_friends[person[:favourites][:tv_show]] << person[:name]
end
end
for array in tv_friends.values()
if array.length() > 1
return array
end
end
end
def电视节目(人物列表)
电视之友={}
用于人员列表中的人员
如果电视节目是朋友的话.key?(人物[:收藏夹][:电视节目]==false
电视朋友[个人[:最爱][:电视节目]]=[个人[:姓名]]
其他的
电视朋友[person[:favorites][:tv\u show]]1
返回数组
结束
结束
结束
它通过了,但有更好的方法吗?我认为您可以用。但是在您的例子中,当您使用
人员列表中的值创建哈希时,您可以使用分配新哈希作为其对象参数,这样您就可以从人员列表中获得自己的人员
哈希,还可以根据需要创建一个新的“空”哈希来开始填充
要检查内部哈希是否有一个值为person[:Favorites][:tv_show]
的键,可以像检查布尔值一样检查它的值,可以跳过与false的比较,if语句将该值计算为false或true
您可以创建变量tv\u show
和name
,以减少一点代码,然后通过tv\u friends
散列在其值中选择长度大于1的值。由于这将为您提供一个数组中的数组,因此您可以使用first
(或[0]
)从中获取第一个元素
def电视节目(人物列表)
tv_friends=people_list。每个带有_对象(Hash.new({}))的| person,Hash|
电视节目=人[:最喜爱的][:电视节目]
姓名=人[:姓名]
hash.key?(电视节目)?散列[tv_show]1}。首先
结束
当方法调用没有参数时,也可以省略括号。哇,谢谢你,这是我们类迄今为止看到的最简洁的解决方案!我相信有更好的解决办法,但如果这对你有帮助,我很高兴。
def tv_show(people_list)
tv_friends = people_list.each_with_object(Hash.new({})) do |person, hash|
tv_show = person[:favourites][:tv_show]
name = person[:name]
hash.key?(tv_show) ? hash[tv_show] << name : hash[tv_show] = [name]
end
tv_friends.values.select { |value| value.length > 1 }.first
end