如何有条件地从数组中删除字符串?

时间:2013-09-29 05:53:52

标签: arrays ruby string

我需要从数组中删除任何不具有一定长度的字符串。作业建议使用mapmap!。我一直在玩map!delete_ifkeep_if,但我无处可去。谁能帮我?以下是我的一次尝试:

dictionary = Array.new

file = File.open("words.txt").each do | line |
    dictionary.push line
end

(wordlength = gets)
wordlength = wordlength.to_i

dictionary = dictionary.reject {|word| word.length != wordlength }

puts dictionary

6 个答案:

答案 0 :(得分:2)

您应该使用Array#delete_if

dictionary.delete_if{|s| s.size != wordlength }

答案 1 :(得分:2)

我会在这里#reject

dictionary = ["apple", "bug", "cup", "drain"]
dictionary.reject {|word| word.length != 3}

答案 2 :(得分:2)

您需要从输入中删除空格:

dictionary.push line.strip 

顺便说一句,读取文件的代码可以简化:

dictionary = File.readlines("words.txt").map { |line| line.strip }

(至于原始问题,delete_ifreject / reject!工作)

修改

完整的代码可能是这样的:

#!/usr/bin/env ruby

dictionary = File.readlines("words.txt").map { |line| line.strip }
wordlength = gets.to_i
dictionary.delete_if { |word| word.length != wordlength }
puts dictionary #test

请注意,reject!delete_if会更改原始数组,因此如果您想保留原始值,则应使用

new_dictionary = dictionary.reject { |word| word.length != wordlength }

甚至

new_dictionary = dictionary.select {|word| word.length == wordlength }

答案 3 :(得分:0)

这里的{p> |word|与您在C ++中使用的i不同。 i将引用dictionary中对象的索引。 |word|这里直接指向dictionary数组中的对象。例如

dictionary = ["animal", "animate"]

|word|会引用对象"animal"i会引用0的索引dictionary。为了更清楚,Ruby甚至有一个可枚举的方法:

.each_with_index do |element, index|
end

其中|element|表示对象,|index|表示对象的索引。

我不建议通过您正在迭代的数组删除,因为每次删除元素时数组的大小都会改变,所以它会产生奇怪的结果。

Arup建议使用delete_if应该可以正常工作。如果这不起作用,您可以尝试另一种方法(尽管效率较低),将每个|word|设置为nil,如果它的长度为!= wordlength,然后压缩它(删除相同的对象)到nil)。

dictionary = []

file = File.open("words.txt").each do | line |
    dictionary << line.strip #strip removes whitespaces and newlines
end

wordlength = gets.chomp.to_i #chomp removes any newlines "\n" 

dictionary = dictionary.each do |word|
    word = nil if word.length != wordlength
end

puts dictionary.compact!

答案 4 :(得分:0)

此代码应该有效:

#!/usr/bin/env ruby

dictionary = File.open("words.txt").map do |line|
  line.strip # remove line end and whitespaces at the beginning and the end of the line
end

wordlength = gets
wordlength = wordlength.to_i

dictionary = dictionary.reject { |word| word.length != wordlength }

puts dictionary #test

有些评论因为这是你有史以来的第一个红宝石计划:

  1. 在ruby中使用&lt;&lt; 运算符向项目中添加项目更为常见。
  2. 您可以使用 map 方法将数组中的每个项目转换为其他项目并返回已转换项目的数组。

答案 5 :(得分:0)

而不是delete_ifkeep_if我只是按照长度对字词进行分组:

file = "/usr/share/dict/words"
words = File.readlines(file).map { |line| line.chomp }.group_by(&:length)

这使得检索不同长度的单词变得微不足道了:

words[5] # all words with length 5
#=> ["aalii", "Aaron", "abaca", "aback", "abaff", "abaft", "Abama", "abase", "abash", "abask", ...]

words[10] # all words with length 10
#=> ["abalienate", "abaptiston", "abasedness", "abbeystede", "abbreviate", "abdication", "abdicative", "abdominous", "aberdevine", "Aberdonian", ...]