在循环中修改的数组导致输出ruby的错误

时间:2012-10-15 06:31:30

标签: ruby

我有一个代码将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"]]

1 个答案:

答案 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