gpt4 book ai didi

swift - 订购一个 NSURL 数组

转载 作者:可可西里 更新时间:2023-11-01 00:58:55 32 4
gpt4 key购买 nike

我正在将大量图像路径加载到 NSURL 中。这些图像位于从 1.PNG、2.PNG、3.PNG 到 1500.PNG 排序的文件夹中。
当我尝试加载它们时:

let imagePath = path + "/images"
let url = NSURL(fileURLWithPath: imagePath)
print(url)
let fileManager = NSFileManager.defaultManager()
let properties = [NSURLLocalizedLabelKey,
NSURLCreationDateKey, NSURLLocalizedTypeDescriptionKey]

do {
imageURLs = try fileManager.contentsOfDirectoryAtURL(url, includingPropertiesForKeys: properties, options:NSDirectoryEnumerationOptions.SkipsHiddenFiles)
} catch let error1 as NSError {
print(error1.description)
}

imageURLs 数组被填充:

imageURLs[0] = ...\0.PNG
imageURLs[1] = ...\1.PNG
imageURLs[2] = ...\100.PNG
imageURLs[3] = ...\1000.PNG

而且不是按数字顺序!
有人可以帮助对 imageURL 进行排序,或者当我在其上加载图像路径时或加载后?

最佳答案

因为你想按数字对文件进行排序,你必须首先解析实现它的路径,所以假设我们有以下数组 NSURL对象:

var urls = [NSURL(string: "file:///path/to/user/folder/2.PNG")!, NSURL(string: "file:///path/to/user/folder/100.PNG")!, NSURL(string: "file:///path/to/user/folder/101.PNG")!, NSURL(string: "file:///path/to/user/folder/1.PNG")! ]

我们可以使用 pathComponents 属性提取一个数组,其中包含 NSURL 路径中的所有组件(例如 ["/", "path", "to", "user", "folder", "2.PNG"])。

如果我们看到我们可以按数组中的最后一个元素对文件进行排序,即文件名删除扩展名和点("."),在本例中为数字。让我们看看如何在下面的代码中做到这一点:

urls.sortInPlace {

// number of elements in each array
let c1 = $0.pathComponents!.count - 1
let c2 = $1.pathComponents!.count - 1

// the filename of each file
var v1 = $0.pathComponents![c1].componentsSeparatedByString(".")
var v2 = $1.pathComponents![c2].componentsSeparatedByString(".")

return Int(v1[0]) < Int(v2[0])
}

在上面的代码中我们使用函数sortInPlace为了避免创建另一个元素排序的数组,但是你可以使用 sort相反,如果你愿意。代码中的另一个重点是行 return Int(v1[0]) < Int(v2[0]) , 在这一行中我们必须将字符串中的数字转换为实数,因为如果我们比较两个字符串 "2""100"第二个小于大于,因为字符串是按字典序比较的。

所以数组urls应该像下面这样:

[file:///path/to/user/folder/1.PNG, file:///path/to/user/folder/2.PNG, file:///path/to/user/folder/100.PNG, file:///path/to/user/folder/101.PNG]

EDIT:

两个函数pathComponentscomponentsSeparatedByString增加 sortInPlace 的空间复杂度算法,如果您可以确保文件的路径始终相同,除了文件名应该是一个数字,您可以使用以下代码:

urls.sortInPlace { $0.absoluteString.compare(
$1.absoluteString, options: .NumericSearch) == .OrderedAscending
}

希望对你有帮助

关于swift - 订购一个 NSURL 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38819395/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com