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