查找数组中的重复项Ruby

yhived7q  于 2022-12-18  发布在  Ruby
关注(0)|答案(4)|浏览(134)

我试图在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]时,它不打印。
有人能帮我解决这两个问题吗?

zqry0prt

zqry0prt1#

我多么希望我们有一个内置的方法Array#difference

class Array
  def difference(other)
    h = other.tally
    reject { |e| h[e] > 0 && h[e] -= 1 }
  end
end

尽管@user123的答案更直接(Array#difference可能是两种方法中效率更高的一种,因为它避免了对count的重复调用)。请参见我的答案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]
eyh26e7m

eyh26e7m2#

对于第一个问题,需要uniq函数,如下所示

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

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

3zwjbxry

3zwjbxry3#

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文件和尝试到运行使用
拼音文件名.rb

fsi0uk1n

fsi0uk1n4#

关于你的“得到”问题,
当你执行gets时,你基本上得到了一个字符串作为输入,而不是一个数组。

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

相关问题