我有一个快速且可能很简单的问题,找不到答案。可能是因为我不太确定如何正确地提出问题,但是这里有:
def test(num)
num_s = num.to_s
num_s.each_char do |number|
p num_s.index(number)
end
end
test(232435)
输出为: 0 1个 0 3 1个 5
我期望的输出: 0 1个 2 3 4 5
为什么不输出连续索引?
答案 0 :(得分:1)
这是因为Sring#index
返回给定子字符串的第一次出现的索引。
您可以read it here。
test(232435)
"2"
首先出现在索引0
"3"
首先出现在索引1
"2"
首先出现在索引0
"4"
首先出现在索引3
"3"
首先出现在索引1
"5"
首先出现在索引5
我期望的输出:0 1 2 3 4 5
仅当您在num
中使用不同的数字时,才可以通过方法获得它。
例如123456
或809163
。
答案 1 :(得分:1)
要回答您的后续问题:
def test(num)
num_s = num.to_s
num_s.each_char.with_index do |number, index| # notice the difference here
p index
end
end
test(232435)
# => 0
# => 1
# => 2
# => ...etc
从这里开始,您还可以继续使用number
参数,例如,如果您想输出更多信息,可以尝试:
def test(num)
num_s = num.to_s
num_s.each_char.with_index do |number, index|
p "Number #{number} is at index #{index}"
end
end
test(232435)
# => "Number 2 is at index 0"
# => "Number 3 is at index 1"
# => ...etc
如果您想做同样的事情,但是有一个数组而不是一个字符串,请使用.each_with_index
代替.each_char.with_index
。
答案 2 :(得分:0)
您可以按照以下步骤进行操作。为简化起见,我将方法参数设置为字符串,而不是立即转换为字符串的整数。
def test(num)
start_index = Hash.new(0)
num.each_char do |digit|
i = num.index(digit, start_index[digit])
puts "index for #{digit} is #{i}"
start_index[digit] = i + 1
end
end
test("232435")
index for 2 is 0
index for 3 is 1
index for 2 is 2
index for 4 is 3
index for 3 is 4
index for 5 is 5
之所以可行,是因为Unix的第二个参数指定了开始搜索的索引 offset 。
问题在于此方法无用。写下面的内容会更简单。
def test(num)
num.each_char.with_index { |digit,i| puts "index for #{digit} is #{i}" }
end
test("232435")
index for 2 is 0
index for 3 is 1
index for 2 is 2
index for 4 is 3
index for 3 is 4
index for 5 is 5
可以向该方法添加参数,该参数是要确定其第一个参数的索引的数字。
def test(num, *args)
start_index = Hash.new(0)
args.each do |digit|
i = num.index(digit, start_index[digit])
puts "index for #{digit} is #{i}"
start_index[digit] = i + 1
end
end
test("232435", "3", "4", "2", "3", "2")
index for 3 is 1
index for 4 is 3
index for 2 is 0
index for 3 is 4
index for 2 is 2
如果要向此方法添加最后一行start_index
,则返回值为
{"3"=>5, "4"=>4, "2"=>3}
表示从下一个"3"
开始搜索下一个5
,依此类推。
自然,将需要其他代码来检查参数是否为数字和字符串的数字,是否为同一数字的参数数目不超过字符串中该数字的数目,依此类推。
答案 3 :(得分:0)
对于所需的输出,与字符串的内容无关。 每个字符串(长度相同)将具有完全相同的输出。您的整个方法仅取决于字符串的长度,而与字符的索引完全无关。字面意思就是:
0...num_s.size
赞:
def test(num)
num_s = num.to_s
(0...num_s.size).map(&method(:puts))
end
test(232435)
# 0
# 1
# 2
# 3
# 4
# 5
但是,数字的十进制表示长度仅为该数字的10个底数的对数:
def test(num)
length = (Math.log(num, 10) + 1).floor
(0...length).map(&method(:puts))
end
test(232435)
# 0
# 1
# 2
# 3
# 4
# 5
因此,这不仅与字符串的内容无关,甚至与实际数字无关,对于任何具有相同数字的数字,输出始终是相同的小数位数,即100000..999999中的任何数字都将产生相同的结果。