通过Swift中的count,从多维数组中找到最大的数组

时间:2017-01-21 09:09:49

标签: ios iphone arrays swift swift3

我有一个多维数组。它本身可以有多个数组。有时可能是5或6.现在我想通过使用数组大小​​从我的多维数组中获取最大的数组。我不知道如何实现这一目标。因此我在这里张贴。提前谢谢。

例如:

[[“a”,“b”,“c”],[“d”,“e”,“f”,“g”,“h”,“i”,“j”]]

3 个答案:

答案 0 :(得分:8)

如果您正在寻找给定内部最长的子阵列 然后你可以简单地使用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显示了如何获取所有 具有最大长度的子阵列。

答案 1 :(得分:3)

也许最明显(不是最短)的方式:

我只是循环遍历数组并检查

中的数组大小
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或其他数组而不是字符串

修改

根据您的评论,只需进行以下更新:

我做了这个功能:

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

这应该返回最长的数组,尽管假设你至少有一个大小&gt;的数组; 0

答案 2 :(得分:2)

@MartinR:s answer中使用的max(by:)方法在这里是适合目的的解决方案,但是(正如我经常写:),为了替代方案的乐趣,你也可以手动&#34 ;折叠数组上的索引,找到与最长子数组对应的索引(最大.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 } */