Ruby 二维数组中的重复项

Ruby 二维数组中的重复项,ruby,Ruby,我在做一个简单的彩票游戏。目前,它从txt文件中获取序列号和彩票号码,并将它们放入二维数组中 现在,我想做一个检查等级,如果有任何重复的序列号和彩票号码 example: 5153,177 = 1 54338,115 = 1 74522,171 = 3 我试过做一个校验数的方法,它不会给出任何错误,但是当我这样做的时候 puts sold.checkgrade 它不起作用 我怎样才能使它像我的例子中那样呢 class Lottery attr_accessor :lotnumbe

我在做一个简单的彩票游戏。目前,它从txt文件中获取序列号和彩票号码,并将它们放入二维数组中

现在,我想做一个检查等级,如果有任何重复的序列号和彩票号码

example:
5153,177 = 1
54338,115 = 1
74522,171 = 3
我试过做一个校验数的方法,它不会给出任何错误,但是当我这样做的时候

puts sold.checkgrade 
它不起作用

我怎样才能使它像我的例子中那样呢

class Lottery

    attr_accessor :lotnumber
    attr_accessor :serialnumber


    def initialize(lotnumber, serialnumber)
       @lotnumber = lotnumber
       @serialnumber = serialnumber
    end

    def checknumber
       ObjectSpace.each_object(Lottery).to_a.select do |other|
       @lotnumber == other.lotnumber && @serialnumber == other.serialnumber
       end.size
    end

end
我的txt

29371,43
13797,6
8114,55
70657,106
32741,74
7272,103
37416,14
5153,177
54338,115
74522,171
74522,171
74522,171

下面是一个完整的工作示例,只是更改了名称

尝试运行此代码,然后修改名称以匹配您的项目

class Counter
  attr_accessor :a
  attr_accessor :b

  def initialize(a, b)
    @a, @b = a, b
  end

  def check_duplicates
    ObjectSpace.each_object(self.class).to_a.select do |other|
      @a == other.a && @b == other.b
    end.size
  end
end


two_match = Counter.new(1, 2) # 2 Matches
duplicate = Counter.new(1, 2)
no_match  = Counter.new(1, 1) # 1 Match

puts two_match.check_duplicates
# => 2

puts no_match.check_duplicates
# => 1
Ruby的方法是一个很好的起点:

data = %w[
  29371,43
  13797,6
  8114,55
  70657,106
  32741,74
  7272,103
  37416,14
  5153,177
  54338,115
  74522,171
  74522,171
  74522,171
]

data.group_by{ |s| s }.map{ |k, v| [k, v.size] } 
# => [["29371,43", 1],
#     ["13797,6", 1],
#     ["8114,55", 1],
#     ["70657,106", 1],
#     ["32741,74", 1],
#     ["7272,103", 1],
#     ["37416,14", 1],
#     ["5153,177", 1],
#     ["54338,115", 1],
#     ["74522,171", 3]]
内部魔法是,
group_by
创建数组散列:

data.group_by{ |s| s }
# => {"29371,43"=>["29371,43"],
#     "13797,6"=>["13797,6"],
#     "8114,55"=>["8114,55"],
#     "70657,106"=>["70657,106"],
#     "32741,74"=>["32741,74"],
#     "7272,103"=>["7272,103"],
#     "37416,14"=>["37416,14"],
#     "5153,177"=>["5153,177"],
#     "54338,115"=>["54338,115"],
#     "74522,171"=>["74522,171", "74522,171", "74522,171"]}
Hash[data.group_by{ |s| s }.map{ |k, v| [k, v.size] }]
# => {"29371,43"=>1,
#     "13797,6"=>1,
#     "8114,55"=>1,
#     "70657,106"=>1,
#     "32741,74"=>1,
#     "7272,103"=>1,
#     "37416,14"=>1,
#     "5153,177"=>1,
#     "54338,115"=>1,
#     "74522,171"=>3}
如果需要哈希而不是数组数组,请执行以下操作:

data.group_by{ |s| s }
# => {"29371,43"=>["29371,43"],
#     "13797,6"=>["13797,6"],
#     "8114,55"=>["8114,55"],
#     "70657,106"=>["70657,106"],
#     "32741,74"=>["32741,74"],
#     "7272,103"=>["7272,103"],
#     "37416,14"=>["37416,14"],
#     "5153,177"=>["5153,177"],
#     "54338,115"=>["54338,115"],
#     "74522,171"=>["74522,171", "74522,171", "74522,171"]}
Hash[data.group_by{ |s| s }.map{ |k, v| [k, v.size] }]
# => {"29371,43"=>1,
#     "13797,6"=>1,
#     "8114,55"=>1,
#     "70657,106"=>1,
#     "32741,74"=>1,
#     "7272,103"=>1,
#     "37416,14"=>1,
#     "5153,177"=>1,
#     "54338,115"=>1,
#     "74522,171"=>3}

嘿,用户!请正确缩进代码。此外,Ruby还使用
\u
来分隔变量名和函数名中的单词<代码>':未定义的方法检查#(NoMethodError)的重复项我现在得到了这个错误你能解释一下(1,2)和(1,1)这些数字是什么吗?好的,似乎可以,但是这些数字(1,2)和(1,1)这些数字的作用是什么?这些数字只是占位符,而不是你展示的较长的数字。现在它打印出5153 177已售出:1倍54338 115已售出:1倍74522 171已售出:3倍74522 171已售出:3倍74522 171已售出:3倍非常好。如果serial和lotnumber是相同的,一个简单的方法只能让它写一次?如果
serial\u number==lot\u number
,你正在寻找一种方法让函数返回
1
?太棒了,但是为什么它写的不是serialnumber和lotterynumber,而是谁写的?但是,在任何情况下,它都不会在我的机器上显示,它只显示我在答案中输入的内容,使用Ruby 2.0.0-p247的IRB、PRY和Sublime文本对其进行测试。