-1

我需要从数组中删除任何不是特定长度的字符串。作业建议使用mapor map!。我一直在玩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
4

6 回答 6

2

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

dictionary.push line.strip 

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

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

(至于原来的问题,delete_ifand reject/ reject!work)

编辑

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

#!/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 }
于 2013-09-29T06:32:52.973 回答
2

您应该需要使用Array#delete_if.

dictionary.delete_if{|s| s.size != wordlength }
于 2013-09-29T05:56:21.853 回答
2

我会和#reject这里一起去。

dictionary = ["apple", "bug", "cup", "drain"]
dictionary.reject {|word| word.length != 3}
于 2013-09-29T05:57:18.647 回答
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

一些评论,因为它是你的第一个 ruby​​ 程序:

  1. 在 ruby​​ 中,使用<<运算符将项目添加到数组中更为常见。
  2. 您可以使用map方法将数组中的每个项目转换为其他内容并返回转换后的项目的数组。
于 2013-09-29T06:51:59.840 回答
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", ...]
于 2013-09-29T08:11:34.410 回答
0

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

dictionary = ["animal", "animate"]

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

.each_with_index do |element, index|
end

where|element|指的是对象,并且|index|指的是对象的索引。

我不建议删除您正在迭代的数组,它会产生古怪的结果,因为每次删除元素时数组的大小都会发生变化。

Arup 的使用建议delete_if应该可以正常工作。如果这不起作用,您可以尝试另一种方法(尽管效率较低),方法是将每个设置|word|为等于nillength != 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!
于 2013-09-29T06:33:09.257 回答