【问题标题】:Compare two hashes with customize rules将两个哈希与自定义规则进行比较
【发布时间】:2016-05-27 13:42:31
【问题描述】:

我需要比较 HTTP URL 中的查询。这是一个典型的查询:

a1 = "name=blabla&id=123456"

查询可能有变量,例如:

a2 = "name=blabla&id={CustomID}"

blur_compare(a1, a2) 应该是true。以下是其他情况:

a3 = "height=170&sex=male"
a4 = "name=blabla"
a5 = "name=blabla&id=654321"
a6 = "id={CustomeID}&name={CustomeName}"

blur_compare(a3, a2) #=> false, params doesn't match.
blur_compare(a4, a2) #=> false, param's number doesn't match.
blur_compare(a5, a1) #=> false, the id doesn't match.
blur_compare(a6, a2) #=> true. order doesn't matter.

我正在考虑将字符串转移到哈希,例如

{"name" => "blabla", "id" => "123456"}

然后进行比较。但是我的代码很乱,又长又丑。很多if-else 条件。我想知道是否有更好的方法来做到这一点。

抱歉,这是代码。只是觉得有点害羞分享它,尤其是当它写得不好的时候。但我正在学习:)。

path_query.rb

class PathQuery

  def self.is_var?(str)
    regex = /^{.*}$/
    str =~ regex ? true : false
  end

  def self.blur_match_query?(query1, query2)
    # deal with the condition when query1 or query2 maybe nil
    if query1 == nil && query2 == nil
      return true
    elsif query1 == nil || query2 == nil
      return false
    else
    end

    res = true
    # return false directly if number of keys is not equal
    if query1.keys.size == query2.keys.size
      query1.each{|k,v|
        # when the value of same key is diff, then need to found out if one of them is variable.
        if v != query2[k]
          if not (PathQuery.is_var?(v) || PathQuery.is_var?(query2[k]))
            res = false
            break
          end
        end
      }
    else
      res = false
    end
    res
  end

end

test_path_query.rb

class TestPathQuery < Minitest::Test
  def test_blur_match_query?()
    a1 = {"name" => "blabla", "id" => "123456"}
    a2 = {"name" => "blabla", "id" => "{CustomID}"}
    a3 = {"height" => "170", "sex" => "male"}
    a4 = {"name" => "blabla"}
    a5 = {"name" => "blabla", "id" => "654321"}
    a6 = {"id" => "{CustomeID}", "name" => "{CustomeName}"}

    assert_equal true, PathQuery.blur_match_query?(a1, a2)
    assert_equal false, PathQuery.blur_match_query?(a1, a3)
    assert_equal false, PathQuery.blur_match_query?(a4, a2)
    assert_equal false, PathQuery.blur_match_query?(a5, a1)
    assert_equal true, PathQuery.blur_match_query?(a6, a2)
    assert_equal true, PathQuery.blur_match_query?(nil, nil)
    assert_equal false, PathQuery.blur_match_query?(nil, a2)
  end
end

【问题讨论】:

  • “我想知道有什么更好的方法吗?” - 比什么更好?您没有包含任何代码。
  • 字符串的解析是不是很麻烦?使用:require "cgi"CGI.parse "name=blabla&amp;id=123456" # =&gt; {"name"=&gt;["blabla"], "id"=&gt;["123456"]}
  • 什么是blur_compare
  • 变量在匹配时总是计算为真?
  • 听起来不太硬或太长。如果您向我们展示一些代码,我们可以提供替代方案。

标签: ruby string hash comparison


【解决方案1】:

试试这个

def self.blur_match_query?(query1, query2)
  (query1.keys-query2.keys).empty?
end

【讨论】:

  • 感谢您的建议。但是我们可以忽略值并仅在值可变时直接比较键。例如a1 = {"name" =&gt; "blabla", "id" =&gt; "123456"}; a2 = {"name" =&gt; "blabla", "id" =&gt; "654321"},而 blur_match_query?(a1, a2) 在这种情况下为 false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2013-12-21
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多