arrays - 使用 Google 表格过滤器查找第一个不连续的数组元素
问题描述
我必须在一个(总是排序的)数组中完成这项工作,该数组是由分割一个分隔的排序整数字符串产生的。具体来说,如果我的单元格包含"1,2,3,5"
我需要一个公式来评估4
。一个有益的副作用是找到一个实现,如果原始数组只有连续数字,则给出最后一个数字+1,即,应用公式"1,2,3,4,5"
将评估为6
。
我的方法是生成一个完美序列的新数组,并将其与我的原始数组进行比较,以找到两个数组不相等的第一个元素。像这样创建一个完美的数组序列:
=TRANSPOSE(SEQUENCE(COUNT(arr),1,MIN(arr),1))
所以剩下要做的就是将 arr 与上面的序列进行比较,以找到第一个不同的元素,例如:
=COUNTA(IFERROR(FILTER(arr;MATCH(arr; transpose(sequence(count(arr),1,min(arr),1))
;0))))
可悲的是,我上面所说的并不是在数组的第一个不相等值处正确“短路”。COUNTIF 是要走的路吗?
如果我的上一步得到了元素的索引而不是值,那么剩下的就是获取该索引处的值:
INDEX( arr, 1, counta(iferror(filter(arr;match(arr1; transpose(sequence(count(arr),1,min(arr),1))
;0)))) )
有没有更直接的方法来获得第一个非连续元素?一种不涉及电子表格中实际范围的方法?
解决方案
经过一番思考,我意识到从生成的序列中减去(即设置差异)原始数组总是给我第一个缺失的数字。所以我处理这个问题的最终公式以及所有数字都按顺序排列的情况是:
IFERROR(INDEX(FILTER(TRANSPOSE(SEQUENCE(COUNT(SPLIT(G7," ")),1,LEFT(G7,4),1)), ISERROR(MATCH(TRANSPOSE(SEQUENCE(COUNT(split(G7," ")),1,LEFT(G7,4),1)),SPLIT(G7, " "),False))),1,1),RIGHT(G7,4)+1) )
我确信有一个更好、更简洁的答案,但这确实有效。
推荐阅读
- azure-container-service - 将现有 Web 应用程序移植到 Azure Service Fabric Mesh
- solr - Solr:尽管在 fieldType 上为用于 Faceting 的字段启用 docValues="true",但使用大量内存的字段缓存
- elasticsearch - elasticsearch-dsl 库中不存在 matrix_stats
- c++ - C ++双重充当浮点数?
- stripe-payments - 如何获得条带连接帐户的总支出?
- c++ - C++什么时候进行深拷贝和浅拷贝?
- java - SPNEGO - 从身份验证检查中排除特定 URL/URL 模式
- angularjs - locationChangeSuccess 上的 AngularJS $state
- vba - 搜索已发送邮件并将多封邮件移动到一个文件夹
- arrays - Swift 用户默认值 - 数组