我需要从数组中删除任何不具有一定长度的字符串。作业建议使用map
或map!
。我一直在玩map!
,delete_if
和keep_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
答案 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_if
和reject
/ 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)
|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
有些评论因为这是你有史以来的第一个红宝石计划:
答案 5 :(得分:0)
而不是delete_if
或keep_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", ...]