在Ruby中查找数组中的重复元素

3

我想在一个包含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]时无法打印。

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


5
尝试运行代码:a.select{ |x| a.count(x) > 1}.uniq,它会选择出现次数大于1的元素并去重。 - Vrushali Pawar
那么我该怎么做呢?它要求我输入一个1到1000000之间的数组。那么我该如何提交我的答案呢? - Shaili Parikh
你确定一定要使用 gets,而不是直接给定一个任意的数组 arr 吗?如果必须使用 gets,那么你只能得到一个字符串,所以你需要将其分解为单独的元素并将其转换为数组。当然,用户必须按照您的说明格式化字符串以便转换为数组。 - Cary Swoveland
@CarySwoveland 对不起,arr是什么意思?它类似于gets吗?我只需要一个输入字符串。 - Shaili Parikh
“arr”只是一个任意数组的名称。如果我问你如何确定数组“arr”(或“a”或“array”)中包含的元素数量,你会回答“arr.size”。相比之下,“gets”是一种方法。 - Cary Swoveland
显示剩余6条评论
5个回答

5

我多么希望我们有一个内置的方法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]

4
针对你的第一个问题,你需要使用uniq函数,例如:
array.select{ |x| array.count(x) > 1}.uniq

关于你的第二个问题,当你使用 array = [gets] 接收值时,它会将你整个数组序列作为单个字符串接收,因此全部存储在 a[0] 中,像这样 ["1, 2 3 4\n"]


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 文件名.rb


一个小细节:不需要使用 chomp! - Cary Swoveland
chomp!不是必需的,只需要使用 chomp 就可以了,因为你正在存储返回的数组。 - RAJ
不需要使用 chompchomp!。试一下。 - Cary Swoveland
@CarySwoveland 我明白你的意思了,你想说 to_i 函数在我们使用 gets.split(" ").map(&:to_i) 这种方式时会自动删除 "\n"。 - RAJ
@RAJ,不是的。假设s = gets.split,而gets返回"1 2 3\n"。那么s = "1 2 3\n".split #=> ["1", "2", "3"] - Cary Swoveland
显示剩余2条评论

0

针对你的“gets”问题,

当你使用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

0

经典方法

   array = [1,2,2,3,4,5,5,5,56,7,8,2,1,3]
   duplicates = []

    0.upto(array.size-1) do |i|
    
       (i+1).upto (array.size-1) do |j|
          if(array[i] == array [j])
            duplicates.push(array[i])
          end
       end
    end

    puts "duplicates=> #{duplicates}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接