在数组Ruby中查找重复项

时间:2015-06-03 05:59:12

标签: arrays ruby

我试图在1到1000000之间的字符串数组中找到重复值。

但是,根据我的代码,我得到输出为所有加倍的条目。

例如,如果我有[1,2,3,4,3,4],它会给出3 4 3 4而不是3 4的输出。

这是我的代码:

array = [gets]

if array.uniq.length == array.length
  puts "array does not contain duplicates"
else
  puts "array does contain duplicates"
  print array.select{ |x| array.count(x) > 1}
end

此外,每次我测试代码时,都必须将数组定义为array = [1,2,3,4,5,3,5]puts有效,但在使用array [gets]时不会打印。

有人可以帮我解决这两个问题吗?

4 个答案:

答案 0 :(得分:3)

Array#difference又来了救援。 (我承认@ user123的答案更直接,除非你假装Array#difference已经是一个内置方法。Array#difference可能是两者中效率更高的,因为它避免了count的重复调用{1}}。)有关方法的说明及其使用的链接,请参阅我的回答here。 简而言之,它与Array#-不同,如以下示例所示:

a = [1,2,3,4,3,2,4,2]
b = [2,3,4,4,4]

a - b          #=> [1]
a.difference b #=> [1, 3, 2, 2]

有一天,我希望将其视为内置。

对于目前的问题,如果:

arr = [1,2,3,4,3,4]

重复元素由:

给出
arr.difference(arr.uniq).uniq
  #=> [3, 4]

答案 1 :(得分:2)

对于您的第一个问题,您需要uniq功能

array.select{ |x| array.count(x) > 1}.uniq

对于您的第二个问题,当您使用array = [gets]收到值时,它会将整个数组序列作为单个字符串接收,因此所有内容都会存储在a[0] ["1, 2 3 4\n"]

答案 2 :(得分:1)

puts "Enter array"
array = gets.chomp.split(",").map(&:to_i)
if array.uniq.length == array.length
  puts "array does not contain duplicates"
else
  puts "array does contain duplicates"
  print array.select{ |x| array.count(x) > 1}.uniq
end

将此代码复制到ruby文件中并尝试使用

运行

ruby​​ file_name.rb

答案 3 :(得分:0)

来到你的“获取”问题,

当你做一个获取时,你基本上得到一个字符串作为输入而不是一个数组。

2.2.0 :001 > array = [gets]
1,2,1,4,1,2,3
 => ["1,2,1,4,1,2,3\n"]

请参阅上面的示例,ruby解释器如何将所有元素作为单个字符串,并将其作为单个数组元素放入数组中。因此,您需要使用逗号作为分隔符将输入显式转换为数组。以下内容将解决您的问题。

array = gets.chomp
array = array.split(',').map(&:to_i)
if array.uniq.length == array.length
  puts "array does not contain duplicates"
else
  puts "array does contain duplicates"
  print array.select{ |x| array.count(x) > 1}.uniq!
end