首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测数组中的下列值是否为重复值

检测数组中的下列值是否为重复值
EN

Stack Overflow用户
提问于 2017-06-28 20:24:04
回答 4查看 139关注 0票数 0

我希望创建一个方法来检测数组中的以下值是否是重复的,如果是的话,将其删除。它应该同时适用于字符串和整数。

例如,给定Array:

代码语言:javascript
复制
arr = ["A", "B", "B", "C", "c", "A", "D", "D"]

返回:

代码语言:javascript
复制
arr = ["A", "B", "C", "c", "A", "D"]

我尝试创建一个空的数组a,并在其中铲入值,提供以下值与当前值不相等。我尝试过这样做:

代码语言:javascript
复制
arr.each do |x|
  following_value = arr.index(x) + 1
  a << x unless x == arr[following_value]
end

不幸的是,它没有将一个重复的值铲入数组中,而是两者都不铲。

代码语言:javascript
复制
arr = ["A", "C", "c", "A"] 

有人能帮忙吗?告诉我我的方法到底出了什么问题。

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-06-28 20:31:59

首先,这里有更简单的解决方案:

代码语言:javascript
复制
> arr.delete_if.with_index { |e, ind| e == arr[ind+1] }
#=> ["A", "B", "C", "c", "A", "D"]

但是,这个解决方案将改变arr。以下是没有变异的单行解决方案:

代码语言:javascript
复制
arr.each_with_index.with_object([]) { |(e, ind), res| res << e if e != arr[ind+1] }
arr.each_with_object([]) { |e, res| res << e if res.last != e }

您在这一行中的问题:a << x unless x == arr[following_value],您说:如果elementnext element不相等,则将其放入result中。因此,您可以这样说:如果结果的最后一个元素与其不相等,则将此元素放到结果中

代码语言:javascript
复制
arr.each do |x|
  a << x unless a.last == x
end
票数 3
EN

Stack Overflow用户

发布于 2017-06-28 21:04:19

我会使用选择,这样你就可以做如下的事情:

代码语言:javascript
复制
a = ["A", "B", "B", "C", "c", "A", "D", "D"]

# without mutation
b = a.select.with_index { |e, i| a[i+1] != e }
a #=> ["A", "B", "B", "C", "c", "A", "D", "D"]
b #=> ["A", "B", "C", "c", "A", "D"]

# with mutation
a.select!.with_index { |e, i| a[i+1] != e }
a #=> ["A", "B", "C", "c", "A", "D"]

顺便说一句,您的方法不起作用,因为arr.index(x) 返回块为真的第一个对象的索引。

代码语言:javascript
复制
arr = ["A", "B", "B", "C", "c", "A", "D", "D"]
arr.each do |x|
  puts "#{x} has index #{arr.index(x)}"
end
A has index 0
B has index 1
B has index 1 # you were expecting 2
C has index 3
c has index 4
A has index 0 # you were expecting 5
D has index 6
D has index 6 # you were expecting 7
票数 2
EN

Stack Overflow用户

发布于 2017-06-28 22:05:55

这里有一个简洁的替代方案:

代码语言:javascript
复制
arr = ["A", "B", "B", "C", "c", "A", "D", "D"]

arr.chunk(&:itself).map(&:first)
# => ["A", "B", "C", "c", "A", "D"]

在repl.it:https://repl.it/JGV4/1上看到它

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44811928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档