Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ruby哈希中检查匹配的键?_Ruby_Hash - Fatal编程技术网

如何在ruby哈希中检查匹配的键?

如何在ruby哈希中检查匹配的键?,ruby,hash,Ruby,Hash,我正在学习编码,其中一个任务是返回键,返回喜欢同一个电视节目的人的名字 我已经设法让它工作并通过了TDD,但我想知道我是否已经走了“很长的路”,也许有一个更简单的解决方案 以下是设置和测试: class TestFriends < MiniTest::Test def setup @person1 = { name: "Rick", age: 12, monies: 1, friends: ["Jay","Keith","Da

我正在学习编码,其中一个任务是返回键,返回喜欢同一个电视节目的人的名字

我已经设法让它工作并通过了TDD,但我想知道我是否已经走了“很长的路”,也许有一个更简单的解决方案

以下是设置和测试:

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