我有一个代码将anagrams放入数组数组中。 (其中包含字谜) 但某处我犯了一个错误,第一个值不作为数组输出,而是作为字符串输出
我正在使用<<操作员将一个阵列推入另一个阵列 代码并不复杂,但我找不到错误
def combine_anagrams(words)
indexes = []
anagrams = []
words.each{|word|
if(word.is_a? String )
first_word = word.downcase.chars.sort.join
words.each{|second_word|
if(second_word.is_a? String)
if(first_word == second_word.downcase.chars.sort.join)
indexes << words.index(second_word)
end
end
}
indexes.each{|index| anagrams << words[index] }
words.reject!.with_index {|el, idx| indexes.include?(idx)}
words << anagrams # i replaced words with an array all_anagrams
indexes = []
anagrams = []
end
}
return words
end
puts combine_anagrams([ 'cars','for', 'potatoes', 'racs', 'four','scar', 'creams', 'scream'] ).inspect
输出
["for", "four", ["cars", "racs", "scar"], ["potatoes"], ["creams", "scream"]]
如果我在输入中切换“cars”和“for”的顺序
["cars", "racs", "scar", ["for"], ["potatoes"], ["four"], ["creams", "scream"]]
这是怎么回事?
对于乱糟糟的代码我很抱歉只是乞求学习红宝石
我创建了一个额外的变量all_anagrams = []
来存储所有字谜的数组
当我将数组输出到sreen上时我得到除了“for”和“four”之外的所有值,由于某种原因,这些值永远不会发送到all_anagrams
可能是因为我在循环中缩短了数组并且这些值被跳过了?
但是,我不知道如何处理这个问题。
all_anagrams的输出是
[["cars", "racs", "scar"], ["potatoes"], ["creams", "scream"]]
答案 0 :(得分:1)
你需要的是在空白之前引入一个新的数组来存储字谜,我们称之为valid_anagrams
。现在你在words
推动它。正如弗雷德里克指出的那样,你在迭代它时修改单词。它不好,并且避免你保留一个名为words_clone
的单词的克隆并拒绝它的项目。以下代码应该有效 -
def combine_anagrams(words)
indexes, anagrams, valid_anagrams = [], [], []
words_clone = words.clone # creating a clone of words
words.each do |word|
if(word.is_a? String )
first_word = word.downcase.chars.sort.join
words.each do |second_word|
if(second_word.is_a? String)
if(first_word == second_word.downcase.chars.sort.join)
indexes << words.index(second_word)
end
end
end
indexes.each{|index| anagrams << words[index] }
# reject from words_cloned instead of words
words_clone.reject!.with_index {|el, idx| indexes.include?(idx)}
# insert anagrams into valid_anagrams array. In your code you inserted it in words array
valid_anagrams << anagrams unless valid_anagrams.include?(anagrams)
indexes, anagrams = [], []
end
end
# return valid_anagrams array
return valid_anagrams
end