删除Ruby Hash中的键数组

Art*_*huk 14 ruby arrays hash

我如何删除散列中的键数组?例如,您可以致电:

hash_array.delete(some_key)
Run Code Online (Sandbox Code Playgroud)

但是我该怎么做呢:

hash_array.delete([key1,key2,key3,...])
Run Code Online (Sandbox Code Playgroud)

不必要地循环遍历阵列.

KL-*_*L-7 16

您可以迭代一组键并删除其中的每个键:

[key1, key2, key3].each { |k| some_hash.delete k }
Run Code Online (Sandbox Code Playgroud)

不记得任何更好的解决方案.

  • 我的意思是你用来从数组中的键中删除哈希值的任何方法都需要遍历那个数组(它至少*会查看*每个键).这意味着计算时间至少是数组长度的线性(乘以哈希中键删除的复杂性).虽然,我可能错了,并乐意看到更好的解决方案. (4认同)
  • 你循环数组一次; 你多次搜索哈希(这很快).我尝试过这个; 创建了一个哈希,其中包含20_000个随机5个字母的单词和一个包含10_000个5个字母单词的数组.@ KL-7的线路执行时间为0.02秒(此计算机已经过时). (3认同)

the*_*raw 12

这正是你正在寻找的......你可以这样做而不必不必要地遍历数组.

keys_to_delete = [key1, key2, key3]
hash_array.except!(*keys_to_delete)
Run Code Online (Sandbox Code Playgroud)

结果存储在hash_array中

  • 这是铁轨的一部分,而不是红宝石. (7认同)

Ali*_*kau 11

您可以尝试使用Hash#delete_if:

delete_if删除hsh中的每个键值对,其中块的计算结果为true.

array_hash.delete_if { |key, _| [key1, key2, key3].include? key }
Run Code Online (Sandbox Code Playgroud)

UPDATE 如果你不想遍历键的数组,你可以使用设置的,而不是Array(因为Set使用Hash作为存储include?为O(1)):

require 'set'
keys = [key1,key2,key3].to_set
array_hash.delete_if { |key, _| keys.include? key }
Run Code Online (Sandbox Code Playgroud)