5

我有一组元素,我想从中取出并多次删除前几个元素。有没有比这更短的方法(所以一个操作而不是两个)来做到这一点:

require 'set'
s = Set[1, 2, 3, 4]       # => #<Set: {1, 2, 3, 4}> 

first_two = s.take(2)     # => [1, 2]
s.subtract(first_two)     # => #<Set: {3, 4}>

(所以基本上我想知道我是否忽略了一个shiftfor Sets)

4

4 回答 4

5

您可以向 Set 类添加一个新方法take!(或remove!任何合适的名称):

class Set
  def take!(args)
    taken = self.take(args)
    self.subtract(taken)
    return taken
  end
end

a = Set[1, 2, 3, 4] # <Set: {1, 2, 3, 4}>
a.take!(2) # <Set: {1, 2}>
a # <Set: {3, 4}>
于 2013-01-30T17:04:53.250 回答
3

使用内置方法没有更短的方法。

对于返回和删除一个元素的方法有一个开放的功能请求;您可能想帮助改进 API?

于 2013-01-30T20:28:41.253 回答
1

来自http://www.ruby-doc.org/stdlib-1.9.3/libdoc/set/rdoc/Set.html

Set 实现了一组无重复的无序值。这是 Array 的直观互操作设施和 Hash 的快速查找的混合体。

在对index一无所知的对象上实现 shift 和 pop 之类的方法会很奇怪,而且可能不合逻辑。

于 2013-01-30T15:06:45.163 回答
0

我迟到了,但这是我的解决方案。先将集合转换为数组,然后所有的 Enumerable 方法都可用。从阵列中取出 2,然后确保也从集合中移除 2。集合中的两个值被删除并返回。

require 'set'
s = Set[1, 2, 3, 4]     # => #<Set: {1, 2, 3, 4}> 

first_two = s.to_a.take(2).tap {|a| s.subtract(a)}  # => [1, 2]
s                       # => #<Set: {3, 4}>
于 2014-12-16T20:21:35.753 回答