Ruby内置方法来获取字母在字母系列中的位置?

时间:2019-01-23 11:10:52

标签: ruby

输入:str = "stackoverflow"

输出:[19 20 1 3 11 15 22 5 18 6 12 15 23]

我们有什么方法可以获取字母在红宝石中的位置?

这样我就可以使用str.chars.map { |al| al.some_method }之类的东西。

str.chars = ["s", "t", "a", "c", "k", "o", "v", "e", "r", "f", "l", "o", "w"]

5 个答案:

答案 0 :(得分:4)

您可以执行此操作。我会使用curl -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/_bulk --data-binary "@test2.json"; echo来返回字符串中每个字符的ASCII码。

String#chars

如您所见,字母是连续的,每个字母比上一个字母高一个。您可以通过从数字中取96来获得字母在字母表中的位置。

请注意,大写字母位于不同的位置,但是我们可以使用'abcdggg'.bytes # => [97, 98, 99, 100, 103, 103, 103] 来解决。

要获取字符串中所有字母位置(如果只有字母),我们可以编写此方法。

String#downcase

如果任何字符都不是字母,这将无法正常工作。

答案 1 :(得分:3)

您可以这样做:

def position(letter)
  letter.upcase.ord - 'A'.ord + 1
end

然后:

chars = ["s", "t", "a", "c", "k", "o", "v", "e", "r", "f", "l", "o", "w"]
chars.map do |char| position(char) end
 => [19, 20, 1, 3, 11, 15, 22, 5, 18, 6, 12, 15, 23] 

有关更多信息,请参见ord方法或此question

答案 2 :(得分:2)

您可以使用字母在字母表中的位置构建哈希,然后查询该哈希:

indexes = ('a'..'z').each_with_index.map{|l,i| [l, i+1]}.to_h
"stackoverflow".chars.map{|l| indexes[l]}
# => [19, 20, 1, 3, 11, 15, 22, 5, 18, 6, 12, 15, 23]

答案 3 :(得分:0)

下面将为您提供所需的结果。

foo

答案 4 :(得分:0)

使用each_charchars更好,因为后者会创建一个立即抛出的数组。

str.each_char.map{|al| al.ord - ?a.ord + 1}
# => [19, 20, 1, 3, 11, 15, 22, 5, 18, 6, 12, 15, 23]