ruby - 您如何检查 ruby​​ 哈希中的匹配键?

标签 ruby hash

我正在学习编码,其中一项作业是返回键,即返回喜欢同一电视节目的人的名字。

我已经设法让它工作并通过了 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

这是我找到的解决方案:

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

它通过了,但是有更好的方法吗?

最佳答案

我认为您可以用 Array#each 替换那些 for 循环.但在您的情况下,当您使用 people_list 中的值创建散列时,您可以使用 Enumerable#each_with_object分配一个新的 Hash 作为它的对象参数,这样你就可以从 people_list 中得到你自己的 person hash,还有一个新的“空”hash 可以根据需要开始填充。

要检查您的内部散列是否具有值为 person[:favourites][:tv_show] 的键,您可以像 bool 值一样检查它的值,可以跳过与 false 的比较,该值将由您的 if 语句评估为 false 或 true。

您可以创建变量 tv_showname 来减少一点代码,然后通过您的 tv_friends 散列来选择它对长度大于 1 的值进行赋值。因为这会给你一个数组内部的数组,你可以从中获得第一个元素 first (或 [0] ).

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

当方法调用没有参数时,您也可以省略括号。

关于ruby - 您如何检查 ruby​​ 哈希中的匹配键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46358898/

相关文章:

ruby-on-rails - asset_packager 和 Jammit 的优缺点是什么?

ruby - 修复 Ruby 代码中出现 "Illegal quoting"错误的无效 CSV 行

algorithm - 根据输入数字生成随 secret 钥

ruby - 如何使用正则表达式匹配哈希对象中的字符串文字等符号?

ruby - 将 JSON 数组转换为 Ruby Hash(哈希值)

ruby-on-rails - 检测 Rails 是否正在运行站点

ruby - 终端不执行 Ruby 文件

即使在执行删除操作时,perl 内存也会在散列中膨胀?

C:使用散列函数将字符串写入(然后读取)文件以定位字节的位置

perl - 在 Perl 中,散列和祝福引用之间的根本区别是什么?