在 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")

备注: ArrayRandomAccessCollection,因此得到 它的countO(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 &lt; $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 中通过计数从多维数组中找到最大的数组的主要内容,如果未能解决你的问题,请参考以下文章

在jQuery中通过ajax发送多维复选框数组

如何在php中通过键值合并两个多维数组?

如何在PHP中通过分隔符将字符串分解为多维数组

110,排序-计数排序

使用 Core Data 在 Swift 中通过 UIProgressView 异步插入数据

如何在 Swift 中通过 MR 的 id 从 coredata 中选择一条记录