在 Swift 中通过计数从多维数组中找到最大的数组
Posted
技术标签:
【中文标题】在 Swift 中通过计数从多维数组中找到最大的数组【英文标题】:Find biggest array from a multi dimensional array by count in Swift 【发布时间】:2017-01-21 09:09:48 【问题描述】:我有一个多维数组。它本身可以有多个数组。有时可能是 5 或 6。现在我想通过使用数组大小从我的多维数组中获取最大的数组。我不知道如何实现这一点。因此我在这里发帖。提前致谢。
例如:
[[“a”、“b”、“c”]、[“d”、“e”、“f”、“g”、“h”、“i”、“j”]]]
【问题讨论】:
你能展示你的嵌套数组吗? 【参考方案1】:如果您正在寻找给定的最长子数组
数组,那么您可以简单地使用max(by:)
进行比较
使用数组计数:
let a = [["a", "b", "c"], ["d", "e", "f", "g", "h", "i", "j"], ["k"]]
let longestSubArray = a.max(by: $0.count < $1.count )!
print(longestSubArray)
// ["d", "e", "f", "g", "h", "i", "j"]
这里我假设a
不为空,否则max(by:)
将返回nil
。如果发生这种情况,请使用可选绑定:
if let longestSubArray = a.max(by: $0.count < $1.count )
print(longestSubArray)
else
print("a is empty")
备注: Array
是 RandomAccessCollection
,因此得到
它的count
是O(1)
操作。
如果你需要最长的元素和它在包含中的索引
数组然后您可以将上述应用到a.enumerated()
:
if let (idx, longest) = a.enumerated().max(by: $0.element.count < $1.element.count )
print("longest subarray", longest)
print("at index", idx)
如果有超过一个最大长度的子数组,那么上面的 解决方案将返回其中之一。 @dfri's answer 显示如何获取 all 具有最大长度的子数组。
【讨论】:
【参考方案2】:也许是最明显(不是最短)的方式:
我只是循环遍历数组并检查里面数组的大小
let anArray = [["Hello", "This", "is"], ["Hello", "This", "is", "a", "5"], ["Hello", "This", "is", "a", "6", "!"]])
var max = 0
for array in anArray
if array.count > max
max = array.count
print(max)
您可以根据自己的目的使用 AnyObject 数组或其他东西来代替字符串
编辑
根据您的 cmets,只需进行以下更新:
我做了这个函数:
func getLongestArray(anArr:[[String]]) -> [String]
var maxArr = [String]()
for array in anArr
if(array.count > maxArr.count)
maxArr = array
return maxArr
然后在适当的情况下进行此调用
let anArray = [["Hello", "This", "is"], ["Hello", "This", "is", "a", "5"], ["Hello", "This", "is", "a", "6", "!"]]
print(getLongestArray(anArr: anArray))
这应该返回最长的数组,尽管假设您至少有一个大小 > 0 的数组
【讨论】:
这只获取数组的大小。我需要最长的数组。无论如何,谢谢。 如何定义最长的数组?包含最多字符串的数组还是数组中的总字符数?我是前者 您的代码只返回最大数量 - 但请求的答案是数组本身 我碰巧遇到一个巨大的数组,其中所有子数组恰好按 w.r.t 的递增顺序排序。对于count
,上面的解决方案将使用大量不必要的浪费数组分配(maxArr = array
)。更明智的做法是简单地跟踪最长子数组的 index,并在退出 for
循环后,简单地返回与“max”索引对应的子数组。
@dfri:由于数组的写时复制实现,我认为分配不是问题。循环变量array
已经是数组元素的副本,我的a.max(by: $0.count < $1.count )
中的$0
、$1
或您的第二个解决方案中的$0
也是如此。【参考方案3】:
@MartinR:s answer 中使用的 max(by:)
方法在这里是适合目的的解决方案,但是(正如我通常写的 :),为了获得替代方案的乐趣,您还可以“手动”折叠数组上的索引以找到最长子数组对应的索引(最大.count
):
let arr = [["a", "b", "c"], ["d", "e", "f", "g", "h", "i", "j"]]
if arr.count > 0
let longestSubArray = arr[
arr.indices.reduce(0) arr[$1].count > arr[$0].count ? $1 : $0 // (*)
]
print(longestSubArray) // ["d", "e", "f", "g", "h", "i", "j"]
/* (*) Alternatively:
arr.indices.lazy.map arr[$0].count .max() ?? 0 */
如果您想找到计数最多的子数组子集(可能不是单个子数组),您可以使用类似的方法并结合filter
:
// two longest subarrays with same count
let arr = [["a", "b", "c"],
["d", "e", "f", "g", "h", "i", "j"],
["k", "l", "m", "n", "o", "p", "q"]]
let maxSubArrayCount = arr.lazy.map $0.count .max() // thanks @muescha (+)
let longestSubArrays = arr.filter $0.count == maxSubArrayCount
print(longestSubArrays) /* [["d", "e", "f", "g", "h", "i", "j"],
["k", "l", "m", "n", "o", "p", "q"]] */
/* (+) Alternatively:
let maxSubArrayCount = arr.reduce(0) $1.count > $0 ? $1.count : $0 */
【讨论】:
你的第一个代码被这个数组破坏了let arr = [["a", "b", "c"], ["2"], ["d", "e", "f", "g", "h", "i", "j"]]
它返回["2"]
较短:let maxSubArrayCount = arr.map$0.count.max()
@muesha 它更短,但会在数组上使用两次(与reduce
方法的单次相比)。不过,arr.lazy.map $0.count .max()
可能只会导致一次通过。
但是reduce需要为数组调用两次count?
我相信(你的提议的稍微修改的版本)arr.lazy.map $0.count .max()
是最好的方法,最后; imo 它的语义略好于reduce
方法。感谢您的反馈!以上是关于在 Swift 中通过计数从多维数组中找到最大的数组的主要内容,如果未能解决你的问题,请参考以下文章