【发布时间】:2016-03-02 21:44:46
【问题描述】:
注意:我找到了一种方法来做我正在寻找的事情,代码如下。我现在需要尽可能地优化它,因为在一个包含 8k 个对象的数组上执行仍然需要 20 多秒
我想对具有path 属性并代表用户系统上的文件的对象进行Array 排序。我想要达到的目标如下:
考虑这个目录结构
├── a
│ └── a.ext
├── b
│ ├── b.ext
│ ├── c.ext
│ └── d
│ └── d.ext
├── c
│ └── e.ext
├── f.ext
└── g.ext
当使用 NSFileManager 读取目录的内容时,我得到的路径不是我想要的顺序。因此,我需要对数组进行排序以获得顺序:
./f.ext
./g.ext
./a/a.ext
./b/b.ext
./b/c.ext
./b/d/d.ext
./c/e.ext
排序应该不区分大小写。对于每个文件夹,首先按字母顺序显示文件,然后显示文件夹,并且在每个文件夹中都适用相同的规则。
有没有办法对数组进行排序以获得所需的顺序?排序函数是什么样子的?
谢谢!
编辑:
我自己找到了解决方案,但我现在想知道是否可以加快速度?
func sorter(obj1: FilesListData, obj2: FilesListData) -> Bool {
var result: Bool = false
let url1 = NSURL(fileURLWithPath: obj1.path)
let url2 = NSURL(fileURLWithPath: obj2.path)
guard let c1 = url1.pathComponents else {
return result
}
guard let c2 = url2.pathComponents else {
return result
}
for i in 0..<min(c1.count, c2.count) {
if c1[i] == c2[i] {
continue
} else {
if i+1 == c1.count {
if i+1 == c2.count {
result = c1[i].lowercaseString < c2[i].lowercaseString
break
} else {
result = true
break
}
} else {
if i+1 == c2.count {
result = false
break
} else {
result = c1[i].lowercaseString < c2[i].lowercaseString
break
}
}
}
}
return asc ? result : !result //asc is a variable indicating if the order should be ascending or not
}
【问题讨论】:
-
我认为你需要扩展你对 NSURL 组件的使用,并将你的整体包装在一个带有自定义比较器的类中。此外,有些种类确实需要时间来完成。您可以通过在插入时使用冒泡排序来加快速度,但比较字符串总是很糟糕。我也不确定免费排序会获得哪些优化。
-
我在我的问题中添加了一些代码,这应该有助于开始优化讨论;)
标签: arrays swift sorting path tree