Avatar billede riversen Nybegynder
24. september 2002 - 16:48 Der er 25 kommentarer og
1 løsning

Sortering af filer

Jeg har følgende to klasser:

import java.io.File;
import java.util.Arrays;

public class Model
{
    private File fil;
   
    public Model()
    {
        setDir( "C:/" );
    }
   
    public void listFiles()
    {
        File[] struktur = fil.listFiles();
       
        Arrays.sort( struktur, new FileComparator() );
       
        for( int i = 0; i < struktur.length; i++ )
            System.out.println( struktur[i] );
    }
   
    public static void main( String[] args )
    {
        Model model = new Model( "C:/" );
        model.listFiles();
    }
}

---

import java.util.Comparator;
import java.io.File;

public class FileComparator implements Comparator
{
    public int compare( Object o1, Object o2 )
    {
        File f1 = (File) o1;
        File f2 = (File) o2;
        String temp1 = "";
        String temp2 = "";
       
        if ( f1.isDirectory() && f2.isDirectory() )
        {
            temp1 = f1.getName().toLowerCase();
            temp2 = f2.getName().toLowerCase();
            return temp1.compareTo( temp2 );
        }

        else if ( f1.isFile() && f2.isFile() )
        {
            temp1 = f1.getName().toLowerCase();
            temp2 = f2.getName().toLowerCase();
            return temp1.compareTo( temp2 );
        }
        if ( f1.isDirectory() && f2.isFile() )
        {
            return -1;
        }
        else if ( f1.isFile() && f2.isDirectory() )
        {
            return 1;
        }
        else
            return 0;   
    }
}

-----

Det bliver ikke udskrevet korrekt sorteret...altså dirs først og dernæst filer
Avatar billede riversen Nybegynder
24. september 2002 - 16:49 #1
Min udskrift er som følger:

C:\Documents and Settings
C:\Inetpub
C:\jdk1.3.1_03
C:\PHP
C:\Program Files
C:\Programmer
C:\Recycled
C:\WINNT
C:\AUTOEXEC.BAT
C:\boot.ini
C:\Bootfont.bin
C:\CONFIG.SYS
C:\DD-GUI.ini
C:\IO.SYS
C:\MSDOS.SYS
C:\NTDETECT.COM
C:\ntldr
C:\pagefile.sys
C:\j2sdk1.4.0_01
C:\j2sdk1.4.1
C:\Kawapro5.0
C:\arcldr.exe
C:\arcsetup.exe
Avatar billede soreno Praktikant
24. september 2002 - 16:56 #2
hvad med at have 2 strukturer, altså en til filnavne og en til dirnavne
if(file.isdir())
  fileList.add(file)
else
  dirList.add(file)

?
Avatar billede riversen Nybegynder
24. september 2002 - 17:01 #3
jeg vil gerne gøre det på måden ovenfor...
har lige opdaget File også implementerer Comparable, men det ændrer ikke noget for mig

import java.util.Comparator;
import java.io.File;

public class FileComparator implements Comparator
{
    public int compare( Object o1, Object o2 )
    {
        File f1 = (File) o1;
        File f2 = (File) o2;
       
        if ( f1.isDirectory() && f2.isDirectory() ||
                f1.isFile() && f2.isFile() )
            return f1.compareTo( f2 );
        else if ( f1.isDirectory() && f2.isFile() )
            return -1;
        else if ( f1.isFile() && f2.isDirectory() )
            return 1;
        else
            return 0;   
    }
}
Avatar billede riversen Nybegynder
24. september 2002 - 17:30 #4
følgende virker...men hvorfor det?
import java.util.Comparator;
import java.io.File;

public class FileComparator implements Comparator
{
    public int compare( Object o1, Object o2 )
    {
        File f1 = (File) o1;
        File f2 = (File) o2;
       
        if ( f1.isDirectory() && f2.isDirectory() ||
                f1.isFile() && f2.isFile() )
            return f1.compareTo( f2 );
        else if ( f1.isDirectory() && f2.isFile() )
            return -1;
        else //( f1.isFile() && f2.isDirectory() )
            return 1;
//        else
//            return 0;   
    }
}
Avatar billede riversen Nybegynder
24. september 2002 - 17:37 #5
næ, stadig en lille fejl

C:\Documents and Settings
C:\Inetpub
C:\j2sdk1.4.0_01
C:\j2sdk1.4.1
C:\jdk1.3.1_03
C:\Kawapro5.0
C:\PHP
C:\Program Files
C:\Programmer
C:\Recycled
C:\WINNT
C:\arcldr.exe
C:\arcsetup.exe
C:\pagefile.sys
C:\AUTOEXEC.BAT
C:\boot.ini
C:\Bootfont.bin
C:\CONFIG.SYS
C:\DD-GUI.ini
C:\IO.SYS
C:\MSDOS.SYS
C:\NTDETECT.COM
C:\ntldr

pagefile.sys er placeret forkert
Avatar billede riversen Nybegynder
24. september 2002 - 18:27 #6
er der ingen der kan svare?

har lige fået at vide der er en bug mht. pagefile.sys...er det korrekt?
Avatar billede soreno Praktikant
24. september 2002 - 18:37 #7
måske fordi pagefile.sys er en skjult fil og sikkert også en systemfil

prøv at teste ved at lave en dummy.ext fil der også er skjult og systemfil.
Avatar billede riversen Nybegynder
24. september 2002 - 18:44 #8
ved ikke hvordan jeg laver den til systemfil, men som skjult er der ingen probs
Avatar billede soreno Praktikant
24. september 2002 - 18:49 #9
gør sådan:
attrib +h +s dummy.ext
Avatar billede riversen Nybegynder
24. september 2002 - 18:49 #10
pagefile.sys siger false til både isfile() og isdirectory()

hvad er den så :-)
Avatar billede soreno Praktikant
24. september 2002 - 18:54 #11
det er vist bare windows der ikke tør overlade kontrollen af pagefile.sys til brugeren :-)
Avatar billede riversen Nybegynder
24. september 2002 - 19:04 #12
soreno: det må blive din løsning, som jeg også havde overvejet, men nu var det her sjovere...der får jeg så ikke listet systemfiler, men det er da bedre end en fejlsortering hvis der er to systemfiler i en mappe :-)
Avatar billede soreno Praktikant
24. september 2002 - 19:10 #13
det er faktisk ikke særligt sjovt at lave noget filnavigerings software i java, mig bekendt kan man ikke skifte drev i java (windows..), eller få en liste over tilgængelige drev. :-(
Avatar billede riversen Nybegynder
24. september 2002 - 19:10 #14
min dumm.ext returnerer godt nok true ved isFile()

jeg er lidt forvirret
Avatar billede riversen Nybegynder
24. september 2002 - 19:11 #15
soreno: jo, det kan du da godt
Avatar billede soreno Praktikant
24. september 2002 - 19:21 #16
hvordan kan man få fat i en liste over tilgængelige drev i windows via java ?
Avatar billede riversen Nybegynder
24. september 2002 - 19:33 #17
FileSystemView.getRoots() kan vel bruges til noget
Avatar billede soreno Praktikant
24. september 2002 - 19:49 #18
ja, det ser da ud til det godt kunne bruges til noget :-)
Avatar billede riversen Nybegynder
24. september 2002 - 20:00 #19
JFileChooser j = new JFileChooser();
        FileSystemView f = j.getFileSystemView();
        File[] array = f.getRoots();
       
        for( int i = 0; i < array.length; i ++ )
            System.out.println( array[i] + " " );


udskriver C:\Documents and Settings\riversen\Skrivebord hos mig :-(
Avatar billede riversen Nybegynder
24. september 2002 - 20:03 #20
File.listRoots() gør trigget ganske enkelt :-)
Avatar billede soreno Praktikant
24. september 2002 - 20:07 #21
derfor:
getRoots

public File[] getRoots()

    Returns all root partitions on this system. For example, on Windows, this would be the "Desktop" folder, while on DOS this would be the A: through Z: drives.



ved nærmere eftersyn ser det ikke ud til at det kan lade sig gøre (med den klasse) :-(
Avatar billede riversen Nybegynder
24. september 2002 - 20:09 #22
nej, men den klasse, men så er det jo heldig vi har File
Avatar billede soreno Praktikant
24. september 2002 - 20:09 #23
ahhh, ok :-)
Avatar billede riversen Nybegynder
24. september 2002 - 20:11 #24
ja, jeg overså den også...jeg må være træt
Avatar billede soreno Praktikant
24. september 2002 - 20:13 #25
sådan nogle metoder plejer jo også at hedde noget med get** :-)
Avatar billede riversen Nybegynder
24. september 2002 - 20:19 #26
det var nemlig det jeg kiggede efter
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester