【问题标题】:Easiest way to SEARCH a Ruby array for a VALUE? (And delete specific array elements)为 VALUE 搜索 Ruby 数组的最简单方法? (并删除特定的数组元素)
【发布时间】:2013-12-17 03:21:24
【问题描述】:

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

我的两个问题是:

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

我需要:

  • 搜索数组%w(2 3 4 5 6 7 8 9 10 J Q K A) #Values for cards 的每个元素,(我将为此使用每个迭代器,我明白了)。 我首先需要知道如何搜索数组。
  • 每次遇到元素匹配项时计数
  • 如果 count == 4,我有一本书,所以我需要知道如何删除数组的特定元素 #(匹配的 4 张卡片)

我知道这很简单,所以感谢您的帮助和耐心!

【问题讨论】:

    标签: ruby arrays search data-structures counter


    【解决方案1】:

    很多过于复杂的答案。

    想知道一个元素是否在数组中?使用include?

    [1, 2, 3, 4].include?(4) # true
    [1, 2, 3, 4].include?(5) # false
    

    想要从数组中删除一个值的所有实例?使用delete

    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]
    

    如果你想统计一个词出现的次数,使用count

    x = ['a', 'a', 'b', 'b', 'b']
    x.count('a') # 2
    x.count('b') # 3
    

    【讨论】:

    • 感谢简单,删除方法效果很好。 然而 include 方法仅在数组具有 元素时返回,而不是元素在数组中出现多少次 次。有什么办法吗?
    • 感谢删除方法!
    • @Yallo 是的,使用count 找出元素在数组中出现的多少次。查看更新的答案。
    【解决方案2】:

    要在数组中搜索元素,您可以使用 select(别名 find_all)。 Select 将遍历并“选择”与提供的块中的条件匹配的元素,返回数组中的“选择”元素。

    例子:

    ['2', '3', '4'].select { |card|  card == '2'  }   #=> ["2"]
    

    您还可以通过使用散列来消除搜索数组的需要(将卡片值映射到卡片数量)。这可以让您轻松检查一手牌包含多少张特定类型的牌(请参见下面的示例)。

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

    示例:卡值 => 计数

    { '2' => 1 }  
    

    要从数组中删除元素,您可以使用#delete 或#delete_at 根据值删除元素或根据数组索引删除元素。另一种选择是使用#select 之类的爆炸方法!根据提供的块转换您当前的数组。对于这样的任务,Ruby 有很多选择。

    我建议浏览一下 Array 和 Enumerable 的方法,以便更好地了解数组可以做什么。非常值得您花时间,因为 Ruby 的强大功能和优雅之处在于 Array 和 Enumerable。

    http://www.ruby-doc.org/core-2.0.0/Array.html#method-i-select

    http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-select

    祝你好运!

    【讨论】:

    • 谢谢,我只是将它与.size 一起使用,效果很好。谢谢!
    【解决方案3】:

    您可能想看看可枚举模块。这里有非常简洁的文档:http://ruby-doc.org/core-2.0.0/Enumerable.html 我的建议是扫描此模块中的所有方法,因为它们都非常有用。对于您的任务,我可能会使用count 方法。如果您想计算所有卡片,group_by 就是您想要的。与map 一起您可以:

    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}  
    

    【讨论】:

      猜你喜欢
      • 2017-06-23
      • 2011-04-06
      • 2016-11-11
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      相关资源
      最近更新 更多