Ruby 按属性对数组中的连续哈希进行分组
我希望能够从一系列约会中找到nx个连续约会的组 我的数据如下所示:Ruby 按属性对数组中的连续哈希进行分组,ruby,Ruby,我希望能够从一系列约会中找到nx个连续约会的组 我的数据如下所示: [{:event_id=>295, :appointment=>false, :accounted=>false}, {:event_id=>296, :appointment=>false, :accounted=>false}, {:event_id=>297, :appointment=>false, :accounted=>false}, {:e
[{:event_id=>295, :appointment=>false, :accounted=>false},
{:event_id=>296, :appointment=>false, :accounted=>false},
{:event_id=>297, :appointment=>false, :accounted=>false},
{:event_id=>311, :appointment=>false, :accounted=>false},
{:event_id=>312, :appointment=>false, :accounted=>false},
{:event_id=>313, :appointment=>false, :accounted=>false},
{:event_id=>314, :appointment=>396, :accounted=>false},
{:event_id=>315, :appointment=>397, :accounted=>false},
{:event_id=>316, :appointment=>398, :accounted=>false},
{:event_id=>317, :appointment=>false, :accounted=>false},
{:event_id=>318, :appointment=>399, :accounted=>false},
{:event_id=>319, :appointment=>false, :accounted=>false},
{:event_id=>320, :appointment=>400, :accounted=>false},
{:event_id=>321, :appointment=>401, :accounted=>false}]>
arr, arr1 = [], []
my_data.each do |e|
arr << e if e[:appointment] != false
arr = [] if e[:appointment] == false
if arr.count == 3
arr1 += arr
arr = []
end
end
2.1.2 :084 > arr1
=> [{:event_id=>314, :appointment=>396, :accounted=>false}, {:event_id=>315, :appointment=>397, :accounted=>false}, {:event_id=>316, :appointment=>398, :accounted=>false}]
我希望能够找到任何3个连续的预约组。因此,在本例中,事件314315316是唯一应该返回的组
老实说,我甚至不知道从哪里开始…你可以这样尝试:
[{:event_id=>295, :appointment=>false, :accounted=>false},
{:event_id=>296, :appointment=>false, :accounted=>false},
{:event_id=>297, :appointment=>false, :accounted=>false},
{:event_id=>311, :appointment=>false, :accounted=>false},
{:event_id=>312, :appointment=>false, :accounted=>false},
{:event_id=>313, :appointment=>false, :accounted=>false},
{:event_id=>314, :appointment=>396, :accounted=>false},
{:event_id=>315, :appointment=>397, :accounted=>false},
{:event_id=>316, :appointment=>398, :accounted=>false},
{:event_id=>317, :appointment=>false, :accounted=>false},
{:event_id=>318, :appointment=>399, :accounted=>false},
{:event_id=>319, :appointment=>false, :accounted=>false},
{:event_id=>320, :appointment=>400, :accounted=>false},
{:event_id=>321, :appointment=>401, :accounted=>false}]>
arr, arr1 = [], []
my_data.each do |e|
arr << e if e[:appointment] != false
arr = [] if e[:appointment] == false
if arr.count == 3
arr1 += arr
arr = []
end
end
2.1.2 :084 > arr1
=> [{:event_id=>314, :appointment=>396, :accounted=>false}, {:event_id=>315, :appointment=>397, :accounted=>false}, {:event_id=>316, :appointment=>398, :accounted=>false}]
arr,arr1=[],[]
我的U数据。每个都有|
arr-arr1
=>[{:事件id=>314,:约会=>396,:占位=>false},{:事件id=>315,:约会=>397,:占位=>false},{:事件id=>316,:约会=>398,:占位=>false}]
您可以这样尝试:
[{:event_id=>295, :appointment=>false, :accounted=>false},
{:event_id=>296, :appointment=>false, :accounted=>false},
{:event_id=>297, :appointment=>false, :accounted=>false},
{:event_id=>311, :appointment=>false, :accounted=>false},
{:event_id=>312, :appointment=>false, :accounted=>false},
{:event_id=>313, :appointment=>false, :accounted=>false},
{:event_id=>314, :appointment=>396, :accounted=>false},
{:event_id=>315, :appointment=>397, :accounted=>false},
{:event_id=>316, :appointment=>398, :accounted=>false},
{:event_id=>317, :appointment=>false, :accounted=>false},
{:event_id=>318, :appointment=>399, :accounted=>false},
{:event_id=>319, :appointment=>false, :accounted=>false},
{:event_id=>320, :appointment=>400, :accounted=>false},
{:event_id=>321, :appointment=>401, :accounted=>false}]>
arr, arr1 = [], []
my_data.each do |e|
arr << e if e[:appointment] != false
arr = [] if e[:appointment] == false
if arr.count == 3
arr1 += arr
arr = []
end
end
2.1.2 :084 > arr1
=> [{:event_id=>314, :appointment=>396, :accounted=>false}, {:event_id=>315, :appointment=>397, :accounted=>false}, {:event_id=>316, :appointment=>398, :accounted=>false}]
arr,arr1=[],[]
我的U数据。每个都有|
arr-arr1
=>[{:事件id=>314,:约会=>396,:占位=>false},{:事件id=>315,:约会=>397,:占位=>false},{:事件id=>316,:约会=>398,:占位=>false}]
您可以这样尝试:
[{:event_id=>295, :appointment=>false, :accounted=>false},
{:event_id=>296, :appointment=>false, :accounted=>false},
{:event_id=>297, :appointment=>false, :accounted=>false},
{:event_id=>311, :appointment=>false, :accounted=>false},
{:event_id=>312, :appointment=>false, :accounted=>false},
{:event_id=>313, :appointment=>false, :accounted=>false},
{:event_id=>314, :appointment=>396, :accounted=>false},
{:event_id=>315, :appointment=>397, :accounted=>false},
{:event_id=>316, :appointment=>398, :accounted=>false},
{:event_id=>317, :appointment=>false, :accounted=>false},
{:event_id=>318, :appointment=>399, :accounted=>false},
{:event_id=>319, :appointment=>false, :accounted=>false},
{:event_id=>320, :appointment=>400, :accounted=>false},
{:event_id=>321, :appointment=>401, :accounted=>false}]>
arr, arr1 = [], []
my_data.each do |e|
arr << e if e[:appointment] != false
arr = [] if e[:appointment] == false
if arr.count == 3
arr1 += arr
arr = []
end
end
2.1.2 :084 > arr1
=> [{:event_id=>314, :appointment=>396, :accounted=>false}, {:event_id=>315, :appointment=>397, :accounted=>false}, {:event_id=>316, :appointment=>398, :accounted=>false}]
arr,arr1=[],[]
我的U数据。每个都有|
arr-arr1
=>[{:事件id=>314,:约会=>396,:占位=>false},{:事件id=>315,:约会=>397,:占位=>false},{:事件id=>316,:约会=>398,:占位=>false}]
您可以这样尝试:
[{:event_id=>295, :appointment=>false, :accounted=>false},
{:event_id=>296, :appointment=>false, :accounted=>false},
{:event_id=>297, :appointment=>false, :accounted=>false},
{:event_id=>311, :appointment=>false, :accounted=>false},
{:event_id=>312, :appointment=>false, :accounted=>false},
{:event_id=>313, :appointment=>false, :accounted=>false},
{:event_id=>314, :appointment=>396, :accounted=>false},
{:event_id=>315, :appointment=>397, :accounted=>false},
{:event_id=>316, :appointment=>398, :accounted=>false},
{:event_id=>317, :appointment=>false, :accounted=>false},
{:event_id=>318, :appointment=>399, :accounted=>false},
{:event_id=>319, :appointment=>false, :accounted=>false},
{:event_id=>320, :appointment=>400, :accounted=>false},
{:event_id=>321, :appointment=>401, :accounted=>false}]>
arr, arr1 = [], []
my_data.each do |e|
arr << e if e[:appointment] != false
arr = [] if e[:appointment] == false
if arr.count == 3
arr1 += arr
arr = []
end
end
2.1.2 :084 > arr1
=> [{:event_id=>314, :appointment=>396, :accounted=>false}, {:event_id=>315, :appointment=>397, :accounted=>false}, {:event_id=>316, :appointment=>398, :accounted=>false}]
arr,arr1=[],[]
我的U数据。每个都有|
arr-arr1
=>[{:事件id=>314,:约会=>396,:占位=>false},{:事件id=>315,:约会=>397,:占位=>false},{:事件id=>316,:约会=>398,:占位=>false}]
您可以使用连续约会对阵列进行分组:
arr = [{:event_id=>295, :appointment=>false, :accounted=>false}, {:event_id=>296, :appointment=>false, :accounted=>false}, {:event_id=>297, :appointment=>false, :accounted=>false}, {:event_id=>311, :appointment=>false, :accounted=>false}, {:event_id=>312, :appointment=>false, :accounted=>false}, {:event_id=>313, :appointment=>false, :accounted=>false}, {:event_id=>314, :appointment=>396, :accounted=>false}, {:event_id=>315, :appointment=>397, :accounted=>false}, {:event_id=>316, :appointment=>398, :accounted=>false}, {:event_id=>317, :appointment=>false, :accounted=>false}, {:event_id=>318, :appointment=>399, :accounted=>false}, {:event_id=>319, :appointment=>false, :accounted=>false}, {:event_id=>320, :appointment=>400, :accounted=>false}, {:event_id=>321, :appointment=>401, :accounted=>false}]
groups = arr.slice_before(appointment: false) { |elt, state|
a, b = state[:appointment], elt[:appointment] # get previous (a) and current (b) appointment
state[:appointment] = elt[:appointment] # update state
a == false || b == false || a.succ != b # slicing condition
}
groups.to_a
#=> [[{:event_id=>295, :appointment=>false, :accounted=>false}],
# [{:event_id=>296, :appointment=>false, :accounted=>false}],
# [{:event_id=>297, :appointment=>false, :accounted=>false}],
# [{:event_id=>311, :appointment=>false, :accounted=>false}],
# [{:event_id=>312, :appointment=>false, :accounted=>false}],
# [{:event_id=>313, :appointment=>false, :accounted=>false}],
# [{:event_id=>314, :appointment=>396, :accounted=>false},
# {:event_id=>315, :appointment=>397, :accounted=>false},
# {:event_id=>316, :appointment=>398, :accounted=>false}],
# [{:event_id=>317, :appointment=>false, :accounted=>false}],
# [{:event_id=>318, :appointment=>399, :accounted=>false}],
# [{:event_id=>319, :appointment=>false, :accounted=>false}],
# [{:event_id=>320, :appointment=>400, :accounted=>false},
# {:event_id=>321, :appointment=>401, :accounted=>false}]]
解释切片条件
在以下情况下,元素将移动到新的组/数组中:
- 以前的约会为false(
)a==false
- 当前约会为false(
)b==false
- 上一次约会不是当前约会的继任者(
)a.succ!=b
false
(我假设约会是false
或整数),并且前一个约会是当前约会的后续约会,它们保留在同一数组中
查找包含3个或更多项的组现在非常简单:
groups.select { |g| g.size >= 3 }
#=> [[{:event_id=>314, :appointment=>396, :accounted=>false},
# {:event_id=>315, :appointment=>397, :accounted=>false},
# {:event_id=>316, :appointment=>398, :accounted=>false}]]
您可以使用按连续约会对阵列进行分组:
arr = [{:event_id=>295, :appointment=>false, :accounted=>false}, {:event_id=>296, :appointment=>false, :accounted=>false}, {:event_id=>297, :appointment=>false, :accounted=>false}, {:event_id=>311, :appointment=>false, :accounted=>false}, {:event_id=>312, :appointment=>false, :accounted=>false}, {:event_id=>313, :appointment=>false, :accounted=>false}, {:event_id=>314, :appointment=>396, :accounted=>false}, {:event_id=>315, :appointment=>397, :accounted=>false}, {:event_id=>316, :appointment=>398, :accounted=>false}, {:event_id=>317, :appointment=>false, :accounted=>false}, {:event_id=>318, :appointment=>399, :accounted=>false}, {:event_id=>319, :appointment=>false, :accounted=>false}, {:event_id=>320, :appointment=>400, :accounted=>false}, {:event_id=>321, :appointment=>401, :accounted=>false}]
groups = arr.slice_before(appointment: false) { |elt, state|
a, b = state[:appointment], elt[:appointment] # get previous (a) and current (b) appointment
state[:appointment] = elt[:appointment] # update state
a == false || b == false || a.succ != b # slicing condition
}
groups.to_a
#=> [[{:event_id=>295, :appointment=>false, :accounted=>false}],
# [{:event_id=>296, :appointment=>false, :accounted=>false}],
# [{:event_id=>297, :appointment=>false, :accounted=>false}],
# [{:event_id=>311, :appointment=>false, :accounted=>false}],
# [{:event_id=>312, :appointment=>false, :accounted=>false}],
# [{:event_id=>313, :appointment=>false, :accounted=>false}],
# [{:event_id=>314, :appointment=>396, :accounted=>false},
# {:event_id=>315, :appointment=>397, :accounted=>false},
# {:event_id=>316, :appointment=>398, :accounted=>false}],
# [{:event_id=>317, :appointment=>false, :accounted=>false}],
# [{:event_id=>318, :appointment=>399, :accounted=>false}],
# [{:event_id=>319, :appointment=>false, :accounted=>false}],
# [{:event_id=>320, :appointment=>400, :accounted=>false},
# {:event_id=>321, :appointment=>401, :accounted=>false}]]
解释切片条件
在以下情况下,元素将移动到新的组/数组中:
- 以前的约会为false(
)a==false
- 当前约会为false(
)b==false
- 上一次约会不是当前约会的继任者(
)a.succ!=b
false
(我假设约会是false
或整数),并且前一个约会是当前约会的后续约会,它们保留在同一数组中
查找包含3个或更多项的组现在非常简单:
groups.select { |g| g.size >= 3 }
#=> [[{:event_id=>314, :appointment=>396, :accounted=>false},
# {:event_id=>315, :appointment=>397, :accounted=>false},
# {:event_id=>316, :appointment=>398, :accounted=>false}]]
您可以使用按连续约会对阵列进行分组:
arr = [{:event_id=>295, :appointment=>false, :accounted=>false}, {:event_id=>296, :appointment=>false, :accounted=>false}, {:event_id=>297, :appointment=>false, :accounted=>false}, {:event_id=>311, :appointment=>false, :accounted=>false}, {:event_id=>312, :appointment=>false, :accounted=>false}, {:event_id=>313, :appointment=>false, :accounted=>false}, {:event_id=>314, :appointment=>396, :accounted=>false}, {:event_id=>315, :appointment=>397, :accounted=>false}, {:event_id=>316, :appointment=>398, :accounted=>false}, {:event_id=>317, :appointment=>false, :accounted=>false}, {:event_id=>318, :appointment=>399, :accounted=>false}, {:event_id=>319, :appointment=>false, :accounted=>false}, {:event_id=>320, :appointment=>400, :accounted=>false}, {:event_id=>321, :appointment=>401, :accounted=>false}]
groups = arr.slice_before(appointment: false) { |elt, state|
a, b = state[:appointment], elt[:appointment] # get previous (a) and current (b) appointment
state[:appointment] = elt[:appointment] # update state
a == false || b == false || a.succ != b # slicing condition
}
groups.to_a
#=> [[{:event_id=>295, :appointment=>false, :accounted=>false}],
# [{:event_id=>296, :appointment=>false, :accounted=>false}],
# [{:event_id=>297, :appointment=>false, :accounted=>false}],
# [{:event_id=>311, :appointment=>false, :accounted=>false}],
# [{:event_id=>312, :appointment=>false, :accounted=>false}],
# [{:event_id=>313, :appointment=>false, :accounted=>false}],
# [{:event_id=>314, :appointment=>396, :accounted=>false},
# {:event_id=>315, :appointment=>397, :accounted=>false},
# {:event_id=>316, :appointment=>398, :accounted=>false}],
# [{:event_id=>317, :appointment=>false, :accounted=>false}],
# [{:event_id=>318, :appointment=>399, :accounted=>false}],
# [{:event_id=>319, :appointment=>false, :accounted=>false}],
# [{:event_id=>320, :appointment=>400, :accounted=>false},
# {:event_id=>321, :appointment=>401, :accounted=>false}]]
解释切片条件
在以下情况下,元素将移动到新的组/数组中:
- 以前的约会为false(
)a==false
- 当前约会为false(
)b==false
- 上一次约会不是当前约会的继任者(
)a.succ!=b
false
(我假设约会是false
或整数),并且前一个约会是当前约会的后续约会,它们保留在同一数组中
查找包含3个或更多项的组现在非常简单:
groups.select { |g| g.size >= 3 }
#=> [[{:event_id=>314, :appointment=>396, :accounted=>false},
# {:event_id=>315, :appointment=>397, :accounted=>false},
# {:event_id=>316, :appointment=>398, :accounted=>false}]]
您可以使用按连续约会对阵列进行分组:
arr = [{:event_id=>295, :appointment=>false, :accounted=>false}, {:event_id=>296, :appointment=>false, :accounted=>false}, {:event_id=>297, :appointment=>false, :accounted=>false}, {:event_id=>311, :appointment=>false, :accounted=>false}, {:event_id=>312, :appointment=>false, :accounted=>false}, {:event_id=>313, :appointment=>false, :accounted=>false}, {:event_id=>314, :appointment=>396, :accounted=>false}, {:event_id=>315, :appointment=>397, :accounted=>false}, {:event_id=>316, :appointment=>398, :accounted=>false}, {:event_id=>317, :appointment=>false, :accounted=>false}, {:event_id=>318, :appointment=>399, :accounted=>false}, {:event_id=>319, :appointment=>false, :accounted=>false}, {:event_id=>320, :appointment=>400, :accounted=>false}, {:event_id=>321, :appointment=>401, :accounted=>false}]
groups = arr.slice_before(appointment: false) { |elt, state|
a, b = state[:appointment], elt[:appointment] # get previous (a) and current (b) appointment
state[:appointment] = elt[:appointment] # update state
a == false || b == false || a.succ != b # slicing condition
}
groups.to_a
#=> [[{:event_id=>295, :appointment=>false, :accounted=>false}],
# [{:event_id=>296, :appointment=>false, :accounted=>false}],
# [{:event_id=>297, :appointment=>false, :accounted=>false}],
# [{:event_id=>311, :appointment=>false, :accounted=>false}],
# [{:event_id=>312, :appointment=>false, :accounted=>false}],
# [{:event_id=>313, :appointment=>false, :accounted=>false}],
# [{:event_id=>314, :appointment=>396, :accounted=>false},
# {:event_id=>315, :appointment=>397, :accounted=>false},
# {:event_id=>316, :appointment=>398, :accounted=>false}],
# [{:event_id=>317, :appointment=>false, :accounted=>false}],
# [{:event_id=>318, :appointment=>399, :accounted=>false}],
# [{:event_id=>319, :appointment=>false, :accounted=>false}],
# [{:event_id=>320, :appointment=>400, :accounted=>false},
# {:event_id=>321, :appointment=>401, :accounted=>false}]]
解释切片条件
在以下情况下,元素将移动到新的组/数组中:
- 以前的约会为false(
)a==false
- 当前约会为false(
)b==false
- 上一次约会不是当前约会的继任者(
)a.succ!=b
false
(我假设约会是false
或整数),并且前一个约会是当前约会的后续约会,它们保留在同一数组中
查找包含3个或更多项的组现在非常简单:
groups.select { |g| g.size >= 3 }
#=> [[{:event_id=>314, :appointment=>396, :accounted=>false},
# {:event_id=>315, :appointment=>397, :accounted=>false},
# {:event_id=>316, :appointment=>398, :accounted=>false}]]
这是我(农业)对它的看法。我还将尝试其他一些解决方案
def remaining_event_apps_consecutive(n)
result = []
consec =[]
@eas.each do |ea|
if ea[:appointment] != false && ea[:accounted] ==false
consec << ea
else
consec = []
end
if consec.size == n
result << consec
consec = []
end
end
result
end
def剩余事件应用程序连续(n)
结果=[]
奉献=[]
@每一个都是
如果ea[:约会]!=false&&ea[:会计]==false
这是我(农业)对它的看法。我还将尝试其他一些解决方案
def remaining_event_apps_consecutive(n)
result = []
consec =[]
@eas.each do |ea|
if ea[:appointment] != false && ea[:accounted] ==false
consec << ea
else
consec = []
end
if consec.size == n
result << consec
consec = []
end
end
result
end
def剩余事件应用程序连续(n)
结果=[]
奉献=[]
@每一个都是
如果ea[:约会]!=false&&ea[:会计]==false
这是我(农业)对它的看法。我还将尝试其他一些解决方案
def remaining_event_apps_consecutive(n)
result = []
consec =[]
@eas.each do |ea|
if ea[:appointment] != false && ea[:accounted] ==false
consec << ea
else
consec = []
end
if consec.size == n
result << consec
consec = []
end
end
result
end
def剩余事件应用程序连续(n)
结果=[]
奉献=[]
@每一个都是
如果ea[:约会]!=false&&ea[:会计]==false
这是我(农业)对它的看法。我还将尝试其他一些解决方案
def remaining_event_apps_consecutive(n)
result = []
consec =[]
@eas.each do |ea|
if ea[:appointment] != false && ea[:accounted] ==false
consec << ea
else
consec = []
end
if consec.size == n
result << consec
consec = []
end
end
result
end
def剩余事件应用程序连续(n)
结果=[]
奉献=[]
@每一个都是
如果ea[:约会]!=false&&ea[:会计]==false
如果事件317丢失,即如果连续约会超过3次,则返回什么?仅前3次连续约会-因为我正在计算哪些约会可以按数量包支付如果