java File.listFiles () på Windows OS ikke logisk sekventiel

Indlæg af Hanne Mølgaard Plasc

Problem



Måske er dette blevet besvaret før, men jeg kunne ikke finde det. Grundlæggende er dette problemet. Jeg har en liste over billedfiler i en mappe. De er nummereret fra 1-n, hvor n -s er større end 10. I mit program opretter jeg et filobjekt, der peger på den mappe, filerne er i, og derefter kalder 'listFiles ()' på filobjektet. Det returnerer filerne, men i følgende rækkefølge:


filename1.jpg
filename10.jpg
filename11.jpg
...
filename2.jpg
filename20.jpg
filename21.jpg
...


Er dette OS rapporterer filen som denne? Hvordan stopper jeg det fra at gøre dette?

Bedste reference


Dokumentationen angiver klart



  Der er ingen garanti for, at navnestrengene i det resulterende array vises i en bestemt rækkefølge; de garanteres især ikke i alfabetisk rækkefølge.



Så du skal bare ikke stole på dette. Du kunne sortere dem, hvis du altid vil have samme ordre ved at bruge:


Arrays.sort(Object[] object);


eller


Arrays.sort(T[] a, Comparator<? super T> c);

Andre referencer 1


brug bare java.util.Collections.sort(list, comparator) og implementer din egen java.util.Comparator, hvis du ikke kan lide, hvordan den er sorteret. Jeg tror, ​​det afhænger af OS, hvordan filer sorteres i det array.

Andre referencer 2


Det virker ok. Prøv at nummerere dem med førende nul, dvs. filename001.jpg.


Med ok mener jeg, at operativsystemet returnerer dem i en alfabetisk (teknisk ASCII-kode) ordre.


EDIT: Som andre har påpeget, er den bedste måde at gøre det på at sortere det selv. På denne måde vundet du ikke på nogen uspecificeret adfærd. Jeg gav et eksempel på, hvordan man gør det med regex matchning:


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> toSort = new ArrayList<String>(Arrays.asList(
                new String[]{
                    "filename1.jpg",
                    "filename11.jpg",
                    "filename2.jpg",
                    "filename21.jpg",}));

        System.out.println(toSort);
        Collections.sort(toSort, new Comparator<String>() {

            Pattern pat = Pattern.compile("filename(\d+)\.jpg");

            public int compare(String a, String b) {
                Matcher matA = pat.matcher(a);
                Matcher matB = pat.matcher(b);
                matA.find();
                matB.find();
                String ga = matA.group(1);
                String gb = matB.group(1);
                return Integer.valueOf(ga).compareTo(Integer.valueOf(gb));
            }
        });
        System.out.println(toSort);
    }
}


Det vender tilbage:


[filename1.jpg, filename11.jpg, filename2.jpg, filename21.jpg]
[filename1.jpg, filename2.jpg, filename11.jpg, filename21.jpg]

Andre referencer 3


Som 'listFiles ()' dokumentation siger:



  Der er ingen garanti for, at navnet strenge i den resulterende array
  vises i en bestemt rækkefølge de er ikke specielt
  garanteret at vises i alfabetisk rækkefølge.



Så du kan navngive dem som Rekin siger og derefter sortere disse filnavne.