在Ruby数组中搜索值的最简单方法?(并删除特定的数组元素)

在Ruby数组中搜索值的最简单方法?(并删除特定的数组元素),ruby,arrays,search,data-structures,counter,Ruby,Arrays,Search,Data Structures,Counter,我是一名新的Ruby程序员,正在进行一项练习,以制作一个让人们玩鱼的程序。我正在建立一种方法,可以搜索书籍,并在找到时进行处理。我将我的玩家手存储在一个数组中,因此我想搜索他们的匹配项 我的两个问题是: 最简单、最有效、最简单的搜索方式是什么 通过数组? 当我在同一个数组中找到某个元素的4时,结果是什么 从数组中删除这些元素的最佳方法? 我需要: 在数组中搜索%w2 3 4 5 6 7 8 9 10 J Q K A的每个元素 对于卡片的值,我将使用do-each迭代器,我得到了。我首先需要知道如

我是一名新的Ruby程序员,正在进行一项练习,以制作一个让人们玩鱼的程序。我正在建立一种方法,可以搜索书籍,并在找到时进行处理。我将我的玩家手存储在一个数组中,因此我想搜索他们的匹配项

我的两个问题是:

最简单、最有效、最简单的搜索方式是什么 通过数组? 当我在同一个数组中找到某个元素的4时,结果是什么 从数组中删除这些元素的最佳方法? 我需要:

在数组中搜索%w2 3 4 5 6 7 8 9 10 J Q K A的每个元素 对于卡片的值,我将使用do-each迭代器,我得到了。我首先需要知道如何搜索数组。 每当我遇到元素的匹配项时,请计数 如果count==4,我有一本书,所以我需要知道如何删除数组中的特定元素以及4张匹配的卡
我知道这很简单,所以谢谢你的帮助和耐心

要搜索数组中的元素,可以使用select alias find_all。Select将循环并选择与所提供块中的条件匹配的元素,返回数组中的选定元素

例如:

['2', '3', '4'].select { |card|  card == '2'  }   #=> ["2"]
您还可以通过使用散列而不是将卡片值映射到卡片数量来消除在数组中搜索的需要。这将允许您轻松检查一手牌包含多少张特定类型的牌,请参见下面的示例

要在每次遇到元素时进行计数,需要一些数据结构来存储卡值和计数。在这里,散列是一个不错的选择

示例:卡值=>count

{ '2' => 1 }  
要从数组中删除元素,可以使用delete或delete_at根据值删除元素或根据其数组索引删除元素。另一个选择是使用像select这样的bang方法!根据提供的块变换当前阵列。Ruby有很多这样的任务选项

我建议浏览Array和Enumerable的方法,以便更好地掌握如何使用数组。这非常值得您花时间,因为Ruby的强大和优雅在于数组和可枚举性


祝你好运

您可能想看看可枚举模块。这里有相当整洁的文档:我的建议是扫描本模块中的所有方法,因为它们都非常有用。对于您的任务,我可能会使用计数方法。如果你想清点所有的牌,你需要的是分组。与地图一起,您可以执行以下操作:

hand = [2,3,6,10,2,J,A,3,J,2,K,K,2]
Hash[hand.group_by{|value| value}.map{|key, values| [key, values.count]}]
# => {2 => 4, 3 => 2, 6 => 1, 10 => 1, J => 2, A => 1, K => 2}  

很多过于复杂的答案

想知道元素是否在数组中吗?使用包括

是否要从数组中删除值的所有实例?使用删除

如果要计算术语出现的次数,请使用计数:


由于简单,delete方法非常有效。但是,include方法仅在数组中包含元素时返回,而不返回元素在数组中出现的次数。有什么要说的吗?谢谢你的删除方法@Yallo是的,使用count来确定元素在数组中出现的次数。请参阅更新的答案。谢谢,我只是将其与。大小一起使用,效果很好。谢谢
[1, 2, 3, 4].include?(4) # true
[1, 2, 3, 4].include?(5) # false
x = [1, 2, 3, 4]
x.delete(4) # 4
x # [1, 2, 3]

y = [1, 1, 2, 2, 3, 3]
y.delete(4) # nil
y # [1, 1, 2, 2, 3, 3]
y.delete(2) # 2
y # [1, 1, 3, 3]
x = ['a', 'a', 'b', 'b', 'b']
x.count('a') # 2
x.count('b') # 3