Ruby嵌套循环

Ruby嵌套循环,ruby,loops,nested-loops,Ruby,Loops,Nested Loops,我在loop1check1中有一个嵌套的loop2check2,但似乎嵌套的loop2check2只运行一次 两个循环包含相同的数组。此脚本用于检查check1中的重复id check1=["0", "0", "0", "1", "1", "2", "3", "4", "5", "100", "4294967294", "9", "11", "6", "200", "7", "201", "811", "202", "204", "3000", "205", "3001", "3001", "3

我在loop1check1中有一个嵌套的loop2check2,但似乎嵌套的loop2check2只运行一次

两个循环包含相同的数组。此脚本用于检查check1中的重复id

check1=["0", "0", "0", "1", "1", "2", "3", "4", "5", "100", "4294967294", "9", "11", "6", "200", "7", "201", "811", "202", "204", "3000", "205", "3001", "3001", "3001"]
check2 =["0", "0", "0", "1", "1", "2", "3", "4", "5", "100", "4294967294", "9", "11", "6", "200", "7", "201", "811", "202", "204", "3000", "205", "3001", "3001", "3001"]
代码:

结果是:

checking against:0 <- checking the 1st element in check1
checking:0|0
checking:0|0
checking:0|0
checking:0|1
checking:0|1
checking:0|2
checking:0|3
checking:0|4
checking:0|5
checking:0|100
checking:0|4294967294
checking:0|9
checking:0|11
checking:0|6
checking:0|200
checking:0|7
checking:0|201
checking:0|811
checking:0|202
checking:0|204
checking:0|3000
checking:0|205
checking:0|3001
checking:0|3001
checking:0|3001
checking against:0<- checking the 2nd element in check1
checking:0|3001   <- nested loop2(check2) is not looping again on the 2nd element of loop 1
checking against:0
checking:0|3001   <- loop2 stops at the last element for the remaining elements in check1
checking against:1
checking:1|3001
checking against:1
checking:1|3001
checking against:2
checking:2|3001
checking against:3
checking:3|3001
checking against:4
checking:4|3001
checking against:5
checking:5|3001
checking against:100
checking:100|3001
checking against:4294967294
checking:4294967294|3001
checking against:9
checking:9|3001
checking against:11
checking:11|3001
checking against:6
checking:6|3001
checking against:200
checking:200|3001
checking against:7
checking:7|3001
checking against:201
checking:201|3001
checking against:811
checking:811|3001
checking against:202
checking:202|3001
checking against:204
checking:204|3001
checking against:3000
checking:3000|3001
checking against:205
checking:205|3001
checking against:3001
checking:3001|3001
checking against:3001
checking:3001|3001
checking against:3001
checking:3001|3001
有人能指出我的错误吗?谢谢。 解决:谢谢大家

check1.each do |ch1|
  counter=0
  check2.each do |ch2|
    if ch1 == ch2
      counter += 1
    end
  end
  if counter > 1
    dupUID << ch1
  end
end

puts dupUID

我想你不应该写这样的代码。有一个更好的解决方案:

x = [0, 10, 15]
y = [0, 20, 15]
x & y # => [0, 15] 
此方法返回指定的两个数组的公共元素

更新了仅在一个阵列中执行此操作的另一种方法:

[0, 10, 10, 15, 20].inject({}) 
{ 
    |a, c| a[c] ||= 0; a[c] = a[c].next; a 
}.delete_if { |k, v| v == 1 }.keys
由于do块变量与check1和check2数组具有相同的名称,因此要对它们进行阴影处理

在内部do块之后,check2引用数组的最后一个元素,而不是数组本身

要解决此问题,请将块变量重命名为类似ch1和ch2的值


因此,这就解释了为什么嵌套循环没有按预期运行。实际上,你的算法本身也是有缺陷的。@floatless的答案提供了一个更好的解决问题的方法。

更短,但更难理解:

check.inject(Hash.new(0)) { |a, x| a[x] += 1; a }.reject { |k, v| v <= 1 }.keys

假设您有一个数组检查,并且希望在其中查找所有重复的元素。使用Ruby 1.9

check.group_by {|v| v}.map { |k, v| v.size > 1 ? k : nil }.compact
说明:

group_by返回一个散列,其中key是数字,value是每次出现的数组。 如果值只出现一次,则map返回nil;如果值出现多次,则map返回该值。 compact清除所有的nil值。 以下是逐步的结果:

# after group_by
{"204"=>["204"], "6"=>["6"], "11"=>["11"], "205"=>["205"], "7"=>["7"], "811"=>["811"], "9"=>["9"], "4294967294"=>["4294967294"], "0"=>["0", "0", "0"], "100"=>["100"], "1"=>["1", "1"], "200"=>["200"], "2"=>["2"], "201"=>["201"], "3"=>["3"], "3000"=>["3000"], "202"=>["202"], "4"=>["4"], "3001"=>["3001", "3001", "3001"], "5"=>["5"]}>

# after map
[nil, nil, nil, nil, nil, nil, nil, nil, "0", nil, "1", nil, nil, nil, nil, nil, nil, nil, "3001", nil]

# after compact
["0", "1", "3001"]
如果您在$VERBOSE=true上有警告,它会通知您所犯的错误

Ruby1.9.1的IRB不允许打开$VERBOSE,但1.9.2会


更新:这个问题让我找到了ruby的文件。谢谢

嗨,很抱歉误会,我需要在check1中找到重复的id。这意味着0,13001应该在Dupui中被标记掉。我认为您的算法有缺陷。为什么要比较两个完全相同的数组?即使使用您的方法,要查找重复项,您也需要检查计数器是否>1,而不是计数器>0,因为从另一个数组中始终会有1个匹配元素,因为它们是相同的。如果你能解释一下你在这里要做什么,我相信有更好的方法可以做到这一点。他试图在一个数组中找到重复的值。这个想法并没有那么糟糕,执行过程中留下了一些需要改进的地方。嗨,Anurag是正确的,它应该是counter>1。我需要在check1中找到重复的id。这意味着0,13001应该在dupUID+1中标记出来,以帮助改进ruby 1.9.2。请参见下面我的答案。
# after group_by
{"204"=>["204"], "6"=>["6"], "11"=>["11"], "205"=>["205"], "7"=>["7"], "811"=>["811"], "9"=>["9"], "4294967294"=>["4294967294"], "0"=>["0", "0", "0"], "100"=>["100"], "1"=>["1", "1"], "200"=>["200"], "2"=>["2"], "201"=>["201"], "3"=>["3"], "3000"=>["3000"], "202"=>["202"], "4"=>["4"], "3001"=>["3001", "3001", "3001"], "5"=>["5"]}>

# after map
[nil, nil, nil, nil, nil, nil, nil, nil, "0", nil, "1", nil, nil, nil, nil, nil, nil, nil, "3001", nil]

# after compact
["0", "1", "3001"]