我有一个多维数组。它本身可以有多个数组。有时可能是5或6.现在我想通过使用数组大小从我的多维数组中获取最大的数组。我不知道如何实现这一目标。因此我在这里张贴。提前谢谢。
例如:
[[“a”,“b”,“c”],[“d”,“e”,“f”,“g”,“h”,“i”,“j”]]
答案 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")
}
备注: 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显示了如何获取所有 具有最大长度的子阵列。
答案 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 } */