输出Ruby索引

时间:2019-02-16 00:12:11

标签: ruby indexing

我有一个快速且可能很简单的问题,找不到答案。可能是因为我不太确定如何正确地提出问题,但是这里有:

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

为什么不输出连续索引?

4 个答案:

答案 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中使用不同的数字时,才可以通过方法获得它。

例如123456809163

答案 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中的任何数字都将产生相同的结果。