Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-将字符串转换为哈希键_Ruby_String_Sqlite_Hash - Fatal编程技术网

Ruby-将字符串转换为哈希键

Ruby-将字符串转换为哈希键,ruby,string,sqlite,hash,Ruby,String,Sqlite,Hash,例如,我有字符串“the Dark Knight 10.0”,我需要将其转换为以下形式的键值散列: 黑暗骑士=>10.0 如何创建一个块,将从.db文件获取的此表单的所有字符串转换为上述表单的键值散列 谢谢你的帮助 您需要一个正则表达式来隔离电影名称和分级(如果10.0是分级)。为了提供更精确的正则表达式,我需要更多的输入,但对于上面的正则表达式,这就完成了(如果电影是《变形金刚2》9.0,它也会正确地使用《变形金刚2=>9.0》): 更“红宝石”的方法是使用rpartition: def co

例如,我有字符串“the Dark Knight 10.0”,我需要将其转换为以下形式的键值散列:

黑暗骑士=>10.0

如何创建一个块,将从.db文件获取的此表单的所有字符串转换为上述表单的键值散列


谢谢你的帮助

您需要一个正则表达式来隔离电影名称和分级(如果10.0是分级)。为了提供更精确的正则表达式,我需要更多的输入,但对于上面的正则表达式,这就完成了(如果电影是《变形金刚2》9.0,它也会正确地使用《变形金刚2=>9.0》):

更“红宝石”的方法是使用rpartition:

def convert_string_into_key_value_and_add_to_hash(string, hash_to_add_to)
  p partition = string.rpartition(' ')
  hash_to_add_to[partition.first] = partition.last.to_f
end

str = "The Dark Knight 2 10.0"
hash = {}

convert_string_into_key_value_and_add_to_hash(str, hash)
p hash #=> {"The Dark Knight 2"=>10.0}

假设集合中已经有字符串,对它们进行迭代(1),按最后一个空格(2)分割,并将结果放入哈希,使用这两部分作为键/值

(1) 请参阅“each”方法

(2) 请参阅“rpartition”方法(此处示例:)


希望有帮助。

如果将文件读入数组,数组中的每个元素都是文件中的一行,则会出现如下情况:

arr = ["The Dark Knight 10.0", "The White Knight 9.4", "The Green Knight 8.1"]
有许多方法可以将每个字符串分成两部分,即散列中的键和值。这是一种方式:

arr.each_with_object({}) do |str,h|
  key, value = str.split(/\s(?=\d)/)
  h[key] = value
end
  #=> {"The Dark Knight"=>"10.0",
  #    "The White Knight"=>"9.4",
  #    "The Green Knight"=>"8.1"}

这里的
(?=\d)
在正则表达式中称为a。

我想说的是,这里的主要问题是为什么这些数据以这种方式存储在数据库中。这种格式毫无意义-您可以控制数据的存储方式吗?完全控制,我使用的是sqlite。我对使用数据库相当陌生-我需要它在这个脚本中记录我的条目,如“添加、更新等”。如果你完全控制它,你需要为标题和评级设置单独的列,并将数据存储在那里。这种存储方式将对应用程序性能产生重大影响。您目前如何通过rails控制器存储它?突然间,这成了一个相当广泛的问题是的,的确如此——我会在私下聊天时这样做,尽管我的账户太新了。我有按标题和评级保存的数据。所以为什么需要拆分上面的数据,它应该已经以比这个字符串更有用的形式来自DB了。您可以发布更多关于如何从db检索数据的代码吗?请在
'15.10 to Yuma 7.0'
中试用它:)所以我刚刚想出了:myint=“The Dark Knight 10.0”。扫描(/\d+/)。加入(“.”),但你所拥有的显然要好得多(我很惊讶你这么快就能想出st)。我正在尝试创建一个电影分级数据库,并尝试从db文件加载哈希,以便添加、更新等。我正在使用从db文件加载的数据定义var“Movies”,但我需要“Movies”是一个带有键值的哈希。此外,我不敢相信您甚至会为了一个示例而使用9.0奖励Transformers 2…问题是,我现在不能定义hash_to_add_to=movies,因为它是“movies”定义的一部分。别担心,你会通过练习变得更好,StackOverflow是一个非常棒的资源,可以让你更好地编程。我没有完全理解您的意思,如果您只需要从散列中获取键值,那么请执行一些\u hash.keys(在本例中,您将只获得电影列表)。
arr.each_with_object({}) do |str,h|
  key, value = str.split(/\s(?=\d)/)
  h[key] = value
end
  #=> {"The Dark Knight"=>"10.0",
  #    "The White Knight"=>"9.4",
  #    "The Green Knight"=>"8.1"}