如何确保某些元素不会进入Ruby中的数组

时间:2012-02-03 10:19:20

标签: ruby arrays

我有一个数组可以说

array1 = ["abc", "a", "wxyz", "ab",......]

我如何确保例如“a”(任何1个字符),“ab”(任意2个字符),“abc”(任意3个字符),以及“that”,“this”,“在array1

中保存了什么“等也没有任何肮脏的词语”

3 个答案:

答案 0 :(得分:3)

这会删除少于4个字符的元素和这样的单词,即array1中的内容(如果我说得对):

array1.reject! do |el|
    el.length < 4 || ['this', 'that', 'what'].include?(el)
end

这会更改array1。如果您使用reject(不包含!),则会返回结果而不会更改array1

答案 1 :(得分:1)

您可以打开并向Array类添加一个新接口,这将禁止某些单词。示例:

class Array
  def add(ele)
    unless rejects.include?(ele)
      self.push ele
    end
  end

  def rejects
    ['this', 'that', 'what']  
  end
end

arr = []

arr.add "one"
puts arr

arr.add "this"
puts arr

arr.add "aslam"
puts arr

输出将是:

  

一一阿斯兰

注意没有添加“this”这个词。

答案 2 :(得分:0)

您可以创建一个停止列表。为此使用散列将比数组更有效,因为查找时间将与散列一致。对于数组,查找时间与数组中元素的数量成比例。如果你要经常检查停用词,我建议使用包含所有停用词的哈希值。使用您的代码,您可以执行以下操作

badwords_a = ["abc", "a", "wxyz", "ab"] # Your array of bad words
badwords_h = {}                         # Initialize and empty hash
badwords_a.each{|word| badwords_h[word] = nil}  # Fill the hash

goodwords = [] 

words_to_process = ["abc","a","Foo","Bar"] # a list of words you want to process

words_to_process.each do |word| # Process new words
 if badwords_h.key?(word)
 else
 goodwords << word  # Add the word if it did not match the bad list
 end
end

puts goodwords.join(", ")