Java – sort an array of file names containing numeric strings

For my project, I need to download a zip file from the FTP server. I can publish a new zip about 13 times a year I need to download the latest file according to the naming convention of the server:

For example: alfp1016f zip

The prefix will always be the same (alfp) and the suffix is f or P (for "full" or "partial"; I only need files ending with F) In addition, there are several other files in the directory that need to be ignored because they have different prefixes Then, I need to get the latest files in the array according to this priority:

>Last year Of course '99 should not be regarded as the latest year. > Latest version number

For example, if I have this file name list (full server directory):

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

My expected output is alfp716f Zip, because 16 is the latest year and 7 is the version number of the latest year

.

This is what I have done so far:

//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(); }
}

I wrote the returnmostrecent (string []) method. I made a tragic attempt, but in the end, there was an incredible garbled code, which is not worth posting here

How do I sort this array and effectively return the most recent files in my order of priority?

Solution

I haven't tested it, but I think it should work

private String returnMostRecent(String[] fileNames) {
   String file = null;
   double version = -1;
   for(String name : listNames)
   {
      // skip files that don't match
      if (!name.matches("ALFP[0-9]*F.zip"))
          continue;
      // get digits only
      String digits = name.replaceAll("\\D+","");
      // format digits to <year>.<version>
      String vstr = digits.substring(digits.length-2,digits.length()) + ".";
      if (digits.length() < 4)
         vstr += "0";
      vstr = digits.substring(0,digits.length()-2);
      double v = Double.parseDouble(vstr);
      if (v > version)
      {
          version = v;
          file = name;
      }
   }

   return file;
}
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>