Sortieren eines Arrays von Dateinamen mit Strings mit Zahlen

Für mein Projekt muss ich eine Zip-Datei von einem FTP-Server herunterladen, der einen neuen Zip etwa 13 Mal im Jahr veröffentlicht. Ich muss die neueste Datei nach der Namenskonvention des Servers herunterladen:
Prefix + release number (one or two digits) + year (two digits) + suffix + ".zip"

Zum Beispiel: ALFP1016F.zip

  • Wie lautet der Lesermodus in Firefox ausgelöst?
  • Getting Touch-Koordinaten nicht genau in ImageView FloodFill Algorithmus
  • Wie berechnen Sie genaue Fuß Schritt zählen mit Beschleunigungssensor in Android?
  • Android: hochwertige Bildgrößenänderung / Skalierung
  • Wahrnehmungsähnlichkeit zwischen zwei Audiosequenzen
  • Der richtige Weg, um Datum mit Strings wie heute, gestern, morgen etc zu formatieren
  • Das Präfix ist immer das gleiche (ALFP) und das Suffix entweder F oder P (steht für "voll" oder "partiell", ich brauche nur die Dateien mit Suffix F). Darüber hinaus gibt es mehrere andere Dateien im Verzeichnis, die ich ignorieren muss, weil sie unterschiedliche Präfixe haben. Dann muss ich die aktuellste Datei im Array nach dieser Prioritätsreihenfolge abrufen:

    1. Letztes Jahr. Natürlich sollte man das jüngste Jahr nicht sehen.
    2. Die neueste Release-Nummer

    Zum Beispiel, wenn ich diese Auflistung der Dateinamen ( vollständiges Serververzeichnis ) habe:

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

    Meine erwartete Ausgabe wäre
    ALFP716F.zip weil 16 das jüngste Jahr ist, und 7 die neueste Release-Nummer aus diesem Jahr

    .

    Hier ist was ich bisher gemacht habe

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

    Ich habe einen miserablen Versuch gemacht, die Methode returnMostRecent(String[]) zu schreiben, aber am Ende mit einem unverständlichen Chaos, das es nicht wert ist, hier geschrieben zu werden.

    Wie kann ich dieses Array sortieren und die aktuellste Datei nach meiner Prioritätsreihenfolge effektiv zurückgeben?

  • Wie man eine "SQLiteConnection für gms Datenbank", die ausgelaufen war, zu beheben
  • Admob Memory Leak - Vermeidung von leeren Aktivitäten
  • SetCompoundDrawablesWithIntrinsicBounds (int, int, int, int) funktioniert nicht
  • Ist es möglich, den Standard "Force Close" Dialog in Android zu ersetzen?
  • Android Alarmmanager in seltsamen Zeiten ausgelöst
  • Android Studio Projektstruktur (vs Eclipse Projektstruktur)
  • 6 Solutions collect form web for “Sortieren eines Arrays von Dateinamen mit Strings mit Zahlen”

    Ich habe das nicht getestet, aber ich denke, es sollte funktionieren.

     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; } 

    Wenn du Java8 benutzt hast, kannst du:

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

    Wo Release-Komparator auf der Extrahierung von Zahlen aus Dateinamen basiert und sie zu vergleichen

    Ich werde diesen Ansatz vorschlagen:

     final String[] filesArr = { "1stpage712.txt", "1stpage712.pdf", "1stpage914.pdf", "ALFP1015F.zip", "ALFP1015P.zip", "ALFP716F.zip", "ALFP716P.zip", "FSFP816F.zip", "FSFP816P.zip" }; // turn the array into a list. final List<String> filesList = new ArrayList<String>(); // add to the list only the good candidates for (int i = 0; i < filesArr.length; i++) { if (filesArr[i].matches("ALFP\\d+F.zip")) { System.out.println("candidate"); filesList.add(filesArr[i]); } } System.out.println(filesList); Collections.sort(filesList, new Comparator<String>() { @Override public int compare(String o1, String o2) { final SimpleDateFormat df = new SimpleDateFormat("mmyy"); // get the date of the file final String dat1 = o1.substring(o1.indexOf("ALFP"), o1.indexOf("ALFP") + 3); final String dat2 = o2.substring(o2.indexOf("ALFP"), o2.indexOf("ALFP") + 3); Date date1; Date date2; try { date1 = df.parse(dat1); date2 = df.parse(dat2); return date1.compareTo(date2); } catch (final ParseException e) { System.out.println("Error parsing date.."); return 0; } } }); // since the sort is made by date chronologically, the 1st element is the oldest and the last element is // the newest System.out.println("The file is: " + filesList.get(filesList.size() - 1)); } 

    Ich werde diese Lösung vorschlagen:

     private static String returnMostRecent(String[] fileNames) { int lastTwoDigits = Calendar.getInstance().get(Calendar.YEAR) % 100; int fullFileRel = 0; int partialFileRel = 0; for(String myStr : fileNames) { if(myStr.startsWith("ALFP")) { System.out.println(myStr); if(myStr.endsWith(""+lastTwoDigits+"F.zip")) { String temp = myStr.substring(4,myStr.length()-7); System.out.println("temp : "+temp); int releaseNum = Integer.parseInt(temp); System.out.println("releaseNum : "+releaseNum); if(releaseNum > fullFileRel) fullFileRel = releaseNum; } if(myStr.endsWith(""+lastTwoDigits+"P.zip")) { String temp = myStr.substring(4,myStr.length()-7); System.out.println("temp : "+temp); int releaseNum = Integer.parseInt(temp); System.out.println("releaseNum : "+releaseNum); if(releaseNum > fullFileRel) partialFileRel = releaseNum; } } } System.out.println("full Rel :"+fullFileRel); System.out.println("partial Rel :"+partialFileRel); if(fullFileRel > partialFileRel) return "ALFP"+fullFileRel+""+lastTwoDigits+"F.zip"; else return "ALFP"+partialFileRel+""+lastTwoDigits+"P.zip"; } 

    Du kannst Regex benutzen und so etwas tun, um das Jahr und die Version zu analysieren:

     public static void main(String[] args) { int year = -1; int version = -1; String test = "ALFP716F.zip"; if(test.matches("ALFP\\d+F.zip")) { Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(test); matcher.find(); String tempString = matcher.group(0); year = Integer.parseInt(tempString.substring((tempString.length() - 2))); version = Integer.parseInt(tempString.substring(0, (tempString.length() - 2))); } System.out.println("Year: " + year + " Version: " + version); } 

    Hier ist Java 1.5 kompatible Lösung, AlphaNumComparator

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.