Air Android AS3 文件数组排序异常:PC正常安卓无序解决方案咨询
这个问题我之前也碰到过,不同平台的文件系统返回文件的默认顺序确实不一样——PC端可能刚好符合你的预期,但Android端的文件系统不会保证按文件名排序返回,所以必须手动对数组做排序处理。下面给你几种实用的解决方案:
按文件名排序
直接针对File对象的name属性做字符串比较,就能实现按文件名排序。如果需要不区分大小写,记得转成小写后再比较:
// 假设你的文件数组是fileArray,元素类型为File fileArray.sort(function(a:File, b:File):int { // 转成小写实现不区分大小写排序,不需要的话可以去掉toLowerCase() var fileNameA:String = a.name.toLowerCase(); var fileNameB:String = b.name.toLowerCase(); if (fileNameA < fileNameB) { return -1; // a排在b前面 } else if (fileNameA > fileNameB) { return 1; // b排在a前面 } else { return 0; // 两个文件名相同,顺序不变 } });
按nativePath排序
如果需要完整路径的排序逻辑,直接使用File对象的nativePath属性即可,逻辑和文件名排序类似:
fileArray.sort(function(a:File, b:File):int { var pathA:String = a.nativePath.toLowerCase(); var pathB:String = b.nativePath.toLowerCase(); if (pathA < pathB) { return -1; } else if (pathA > pathB) { return 1; } else { return 0; } });
针对带数字文件名的自然排序
如果你的文件名包含数字(比如img1.jpg、img10.jpg、img2.jpg),默认的字符串排序会把img10.jpg排在img2.jpg前面,这时候需要用自然排序来让数字按数值大小排序:
// 先定义自然排序的辅助函数 function naturalStringCompare(strA:String, strB:String):int { var numRegex:RegExp = /(\d+)/g; // 把字符串拆分成数字和非数字片段 var partsA:Array = strA.toLowerCase().split(numRegex); var partsB:Array = strB.toLowerCase().split(numRegex); // 逐个片段比较 for (var i:int = 0; i < Math.min(partsA.length, partsB.length); i++) { var partA:String = partsA[i]; var partB:String = partsB[i]; if (partA !== partB) { var numA:Number = parseFloat(partA); var numB:Number = parseFloat(partB); // 如果是数字片段,按数值比较 if (!isNaN(numA) && !isNaN(numB)) { return numA - numB; } else { // 非数字片段按字符串比较 return partA.localeCompare(partB); } } } // 如果前面的片段都相同,长度短的排在前面 return partsA.length - partsB.length; } // 使用自然排序处理文件数组 fileArray.sort(function(a:File, b:File):int { return naturalStringCompare(a.name, b.name); });
注意:一定要在获取完所有文件并填充到数组之后再执行排序操作,确保数组元素齐全,排序结果才会正确。
内容的提问来源于stack exchange,提问作者Abraam Mamdouh




