You need to enable JavaScript to run this app. Android开发:如何过滤ListView中不包含指定文件的空文件夹
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何过滤ListView中不包含指定文件的空文件夹

问题核心原因

你写的第二版代码逻辑出现了嵌套循环重复遍历的错误:只要检测到任意一个文件夹下存在含大写S的文件,就会把根目录下所有符合72天修改时间要求的文件夹都添加到结果列表,完全没有把「含指定文件」和「当前遍历的文件夹」做绑定,所以过滤失效。

修正后的实现代码

public static File dir = new File(Environment.getExternalStorageDirectory().getPath() + "/Sales/Archive");
ArrayList<String> theNamesOfFiles = new ArrayList<>();

File[] filelist = dir.listFiles();
if (filelist == null) {
    // 目录不存在或无权限时直接返回,避免空指针崩溃
    return;
}
// 先对文件夹按修改时间倒序排序,只需排序一次即可,不要放在循环里重复排序
Arrays.sort(filelist, Comparator.comparingLong(File::lastModified).reversed());

long sevenTwoDaysMs = 72L * 24 * 60 * 60 * 1000; // 直接换算72天的毫秒数,避免除法精度问题
long currentTime = new Date().getTime();

for (File folder : filelist) {
    // 先校验两个基础条件:是文件夹、修改时间在72天内
    if (!folder.isDirectory()) {
        continue;
    }
    long diff = currentTime - folder.lastModified();
    if (diff >= sevenTwoDaysMs) {
        continue;
    }

    // 再校验文件夹内是否有名称含大写S的文件
    boolean hasValidFile = false;
    File[] childFiles = folder.listFiles();
    if (childFiles != null && childFiles.length > 0) {
        for (File child : childFiles) {
            if (child.getName().toUpperCase().contains("S")) {
                hasValidFile = true;
                break; // 找到符合要求的文件就跳出子循环,无需继续遍历
            }
        }
    }

    // 所有条件都满足才加入结果列表
    if (hasValidFile) {
        theNamesOfFiles.add(folder.getName());
    }
}

关键优化点说明

  • 排序逻辑移到循环外执行,原来的代码放在循环内每遍历一次就排序一次,严重浪费性能
  • 用72天对应的毫秒数直接做差值判断,避免多次除法导致的精度误差,计算效率更高
  • 增加空指针校验,避免目录无访问权限、目录为空时出现空指针崩溃
  • 每个文件夹的校验逻辑独立:先判断是否符合时间要求,再单独校验自身内部是否存在指定格式的文件,符合所有条件才加入列表,不会出现误加其他文件夹的问题

内容的提问来源于stack exchange,提问作者Darsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 17:15:01