java - 对包含带数字的字符串的文件名数组进行排序

标签 java android arrays algorithm sorting

对于我的项目,我需要从 FTP 服务器下载一个 zip 文件,该服务器每年大约发布 13 次新的 zip。我需要按照服务器的命名约定下载最新的文件:
前缀+版本号(一位或两位)+年份(两位)+后缀+“.zip”

例如: ALFP1016F.zip

前缀将始终相同 (ALFP),后缀为 F 或 P(代表“完整”或“部分”;我只需要以后缀 F 结尾的文件)。最重要的是,我需要忽略目录中的其他几个文件,因为它们具有不同的前缀。然后,我需要按照此优先顺序获取数组中的最新文件:

  1. 最近一年。当然,'99 不应被视为最近的一年。
  2. 最新版本号

例如,如果我有这个文件名列表(full server directory):

1stpage712.pdf
1stpage914.pdf
ALFP1015F.zip
ALFP1015P.zip
ALFP716F.zip
ALFP716P.zip
FSFP816F.zip
FSFP816P.zip

我的预期输出是
ALFP716F.zip 因为 16 是最近的一年,而 7 是那一年的最新版本号

.

这是我到目前为止所做的:

//necessary imports
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

//initialize FTP client
ftpClient = new FTPClient();

try {
    //connect to server
    ftpClient.connect(server, port);
    ftpClient.login(username, password);
    ftpClient.enterLocalPassiveMode();
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

    //list all names from server
    String[] filenames = ftpClient.listNames();

    //return expected file name
    String expectedFileName = returnMostRecent(filenames);
} catch (Exception e) { 
    e.printStackTrace(); 
} finally {
    try {
        if (ftpClient.isConnected()) {
            ftpClient.logout();
            ftpClient.disconnect();
            System.out.println("Disconnected from server");
        }
    } catch (IOException ex) { ex.printStackTrace(); }
}

我在编写 returnMostRecent(String[]) 方法时做了一次悲惨的尝试,但结果是一团乱七八糟的东西,不值得在这里发布。

我怎样才能对这个数组进行排序,并按照我的优先顺序有效地返回最新的文件?

最佳答案

如果您使用 Java8,您可以:

String file = Arrays.stream(filenames)
                    .filter(s -> s.startsWith("ALFP") && s.endsWith("F.zip"))
                    .max(getReleaseComparator())                        
                    .orElse(null);

其中发布比较器基于从文件名中提取数字并进行比较

关于java - 对包含带数字的字符串的文件名数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36040653/

相关文章:

python - 如何使用包含我要访问的索引号的数组获取 numpy 数组中的所有值

java - SoLR 中具有特殊字符的字段排序

java - Kotlin:在具有加密主页的 Linux 上:java.io.FileNotFoundException(文件名太长)

android - phonegap 媒体错误代码 0

arrays - 为数组中最小的 k 个元素调整快速选择

javascript - sub ng-repeats,以 Angular 获取(选中)复选框值

java - Android:两个 ScaleAnimations 顺序执行

java - 无法从另一个 Maven 子项目调用 Hibernate/QueryDSL

android - 如何在 react native android native 代码中获取应用程序实例?

java - 在某些设备上运行 Android 应用程序时出现奇怪的 RuntimeException