【问题标题】:Remove string values that differ only in case from an array (Ruby)从数组中删除仅大小写不同的字符串值(Ruby)
【发布时间】:2012-11-06 20:12:00
【问题描述】:

所以,这是前言:

我是 Ruby 的初学者。我正在研究一个字谜查找脚本(在文本文件中查找所有字谜)。本质是:我创建了一个字典,其中键是单词代码,值是一个数组,其中包含引用此代码的单词。就是这样:{"abdeis"=>["abides", "biased"] ,"achr"=>["char"], ... }。最后我只是打印出长度> 1的值。到目前为止一切顺利。

这是交易:我想修改输出,以便省略此类情况:["Wood", "wood", "WooD"] - 仅在大小写情况下都是不同的。但是这种情况应该保留:["Doom", "DooM", "mood"]

我目前的一段代码:

def print_anagram(anagram_dict)
  anagram_list = anagram_dict.values
  anagram_list.each { |i|
    if i.length > 1
      print i.join("\t")
      print "\n"
    else
      next
    end
   }
end

anagram_dict 是上面提到的字典。

我应该做哪些检查才能扔掉这些箱子?我想到的东西对我来说似乎很笨重。提前致谢!

【问题讨论】:

  • 我不明白 ["Wood", "WooD"] 和 ["Doom", "DooM"] 之间的区别。
  • @steenslag:厄运阵还包括“心情”,木阵只有“木”
  • “我想到的东西对我来说似乎太庞大了。”你想到了什么?这几乎看起来像家庭作业,如果它应该被标记为这样,并且在这里不被禁止。在回答你的问题。我可能会让一切都一样,并在其上称为唯一
  • @vgoff 作业标签已过时(尝试搜索)。
  • 谢谢@steenslag。我看到了大约 4800 个,所以直到现在才知道。仍然可以充分披露问题本身。

标签: ruby arrays anagram


【解决方案1】:
def print_anagram(anagram_dict)
  anagram_list = anagram_dict.values
  anagram_list.each do |i|
    next if i.map(&:downcase).uniq.length == 1

    if i.length > 1
      print i.join("\t")
      print "\n"
    else
      next
    end
  end
end

这是做什么的:

  • 将所有字符串设为小写

  • 仅从数组中获取唯一元素

  • 如果你只有一个独特的元素,那么所有的元素都是一样的

map(&:downcase) 是一种更短的方式:map { |element| element.downcase }

【讨论】:

  • 谢谢,成功了!我现在将尝试为此找到一些其他解决方案,也许会稍微摆弄一下 Array#reject。
【解决方案2】:

这是你想要的吗?

def print_anagram(anagram_dict)
  anagram_list = anagram_dict.values.uniq{|word| word.downcase}
  # rest of your code

【讨论】:

  • 我明白你的意思了,这正是我一直在寻找的东西。它应该可以工作,但由于某种原因,它给我带来了一个错误:undefined method downcase' for ["A's"]:Array (NoMethodError)`。我会尝试调试东西,看看出了什么问题。
猜你喜欢
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2014-07-12
  • 1970-01-01
  • 2013-03-12
  • 2012-05-10
相关资源
最近更新 更多