我将把我的评论限制在你的最后一句话:“我哪里错了?”
arrTV = ['Thor: The Dark World', 'Ender's Game', 'Jackass Presents: Bad Grandpa', \
'Last Vegas', 'Free Birds', 'Free Birds' ]
[编辑:正如@Michael 指出的那样,您必须arrTV
转义(特别是)元素中的所有撇号'Ender\'s Game'
。或者,您可以将字符串括在双引号中:
arrTV = ["Thor: The Dark World", "Ender's Game", "Jackass Presents: Bad Grandpa", \
"Last Vegas", "Free Birds", "Free Birds" ]
我建议做后者。编辑结束]
看来您首先尝试了这个:
arrTV.each do |i|
count = 0
if arrTV[i] == arrTV[i+1]
puts "equal"
count = count + 1
end
puts count
end
第一次通过 ( do..end
) 块,i
设置为等于 的第一个元素arrTV
,即'Thor: The Dark World'
,因此您正在尝试执行
if arrTV['Thor: The Dark World'] == arrTV['Thor: The Dark World'+1]
这将引发错误。考虑改为这样做
if arrTV[count] == arrTV[count+1]
更好,但仍然存在一些问题。首先,每次将块传递给 的元素时arrTV
,count
都将其重置为零。你可以通过移动count = 0
before来解决这个问题arrTV.delete_at(i+1)
。此外,移动puts count
到if
语句的末尾(就在 之前end
)。
其次,什么时候发生count = 5
?那时你正在执行
if arrTV[5] == arrTV[6],
但arrTV
只包含 6 个元素,最后一个是 indexed 5
。arrTV[6]
没有定义。有很多方法可以解决这个问题。一是添加:
break if count == 5
后
count = count + 1
看起来您接下来尝试在块内执行此操作
if arrTV[i] = arrTV[i+1]
arrTV.delete_at(i+1)
(顺便说一句,请注意您需要==
,而不是=
在第一条语句中。)即使我们i
用 count 替换,您也试图在arrTV
对其进行交互时删除一些元素。那是不行的。你需要做的是从这个开始:
(0..arrTV.size-2) each do |i|
有了这个,你不再需要count
. 处理完arrTV
. 更重要的是,由于您没有遍历 的元素arrTV
,因此可以在循环中删除它们:
arrTV.delete_at(i+1)
(这样,您还可以向arrTV
中添加元素或修改元素。)我将留给您从这里修复它。但是,我想指出的是,您采用的方法只会消除重复元素,如果它们是arrTV
. 如果顺序不重要,则需要修改方法。
最后,一个 Ruby 约定是仅使用小写字母作为变量名,并在必要时添加下划线以提高可读性。您可能会使用类似的东西arr_tv
,而不是arrTV
.