Problema con list file e sort

di il
9 risposte

Problema con list file e sort

Ciao!

ho questo metodo ricorsivo per listare i file e le directory, per poi riempire un JTree:

    private void scanDir(DefaultMutableTreeNode node, File dir) {
        DefaultTreeModel model = new DefaultTreeModel(node);
        if (!dir.isDirectory()) {
            DefaultMutableTreeNode child = new DefaultMutableTreeNode(dir);
            node.add(child);
        } else {
            DefaultMutableTreeNode child = new DefaultMutableTreeNode(dir);
            node.add(child);
            File files[] = dir.listFiles();
            Arrays.sort(files, new MyComparator());
            for (File file : files) {
                scanDir(child, file);
            }
        }
        tree.setModel(model);
    }
dove il MyComparator è:

public class MyComparator implements Comparator<File> {

    @Override
    public int compare(File f1, File f2) {
        if (f1.isFile() && f2.isDirectory()) {
            return 1;
        } else if (f1.isDirectory() && f2.isFile()) {
            return -1;
        } else {
            return f1.getName().compareTo(f2.getName());
        }
    }
}
il tutto funziona, tranne che nel primo livello.
cioè, il primo livello non viene ordinato, mentre i sotto livelli si.
ovviemente perchè il sort l'ho messo solo nell'else, ma come posso ordinare anche la prima directory??

9 Risposte

  • Re: Problema con list file e sort

    fermat ha scritto:


    il tutto funziona, tranne che nel primo livello.
    cioè, il primo livello non viene ordinato, mentre i sotto livelli si.
    ovviemente perchè il sort l'ho messo solo nell'else, ma come posso ordinare anche la prima directory??
    Prova a ragionare così: viene passato al metodo scanDir un File che è (e deve essere!) una directory. La prima cosa da fare è scansionarla (listFiles) e poi ordinare l'elenco. Quindi "per ciascuna entry": la devi certamente aggiungere come "figlio" di node, indipendentemente dal fatto che sia un file o directory ... sono tutti "sotto" il nodo parente, no? L'unica differenza poi è che se è una directory, allora (e solo allora) devi andare in ricorsione per andare più in profondità.
  • Re: Problema con list file e sort

    Ciao andbin!

    ho provato così:
    
        private void scanDir(DefaultMutableTreeNode node, File dir) {
            DefaultTreeModel model = new DefaultTreeModel(node);
            File[] files = dir.listFiles();
            Arrays.sort(files, new MyComparator());
            DefaultMutableTreeNode first = new DefaultMutableTreeNode(dir);
            node.add(first);
            for (File file : files) {
                if (file.isDirectory()) {
                    DefaultMutableTreeNode child = new DefaultMutableTreeNode(file);
                    node.add(child);
                    scanDir(child, file);
                } else {
                    DefaultMutableTreeNode child = new DefaultMutableTreeNode(file);
                    node.add(child);
                }
            }
            tree.setModel(model);
        }
    
    però l'ordinamento non avviene più in nessun ramo!
  • Re: Problema con list file e sort

    fermat ha scritto:


    però l'ordinamento non avviene più in nessun ramo!
    Mi pare ancora più "fumoso" di prima. E comunque non capisco perché crei il DefaultTreeModel e lo setti nel JTree dentro scanDir, che è il metodo ricorsivo!
    Di DefaultTreeModel ce ne deve essere uno solo, creato con il nodo che deve essere quello relativo alla directory "radice".
    Non ho purtroppo tempo di verificare o provare qualcosa di concreto.
  • Re: Problema con list file e sort

    Io "girerei" la cosa in un altro senso, del tipo (scritto al volo, non provato):
    private DefaultMutableTreeNode scanFile(File file) {
        DefaultMutableTreeNode node = new DefaultMutableTreeNode(file);
    
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            Arrays.sort(files, new MyComparator());
    
            for (File f : files) {
                DefaultMutableTreeNode childNode = scanFile(f);
                node.add(childNode);
            }
        }
    
        return node;
    }
    Che è molto semplice e lineare. Poi da qualche parte:
    DefaultMutableTreeNode rootNode = scanFile(rootDirectory);
    DefaultTreeModel model = new DefaultTreeModel(rootNode);
    jtree.setModel(model);
    Se 'rootDirectory' invece fosse un file e non una directory (come caso estremo/anomalo) ... funzionerebbe comunque lo stesso, avresti un solo nodo radice che è un file.
  • Re: Problema con list file e sort

    Si in effetti avevi ragione sul model.
    non aveva senso.
    cmq inizialmente il jtree è vuoto.
    viene riempito solo quando viene selezionata una directory con il JFileChooser.
    quindi diciamo che non c'è neanche il "pericolo" che venga selezionato un file.

    quindi sull'evento ho messo questo:
    
                    FileChooserOpen fco = new FileChooserOpen();
                    fco.showOpenDialog(null);
                    File dir = fco.getDir();
                    DefaultMutableTreeNode root = scanDir(dir);
                    DefaultTreeModel model = new DefaultTreeModel(root);
                    tree.setModel(model);
    
    e poi ho modificato il metodo scanDir come da tuo esempio:
    
        private DefaultMutableTreeNode scanDir(File file) {
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(file);
            if (file.isDirectory()) {
                File[] files = file.listFiles();
                Arrays.sort(files, new MyComparator());
                for (File f : files) {
                    DefaultMutableTreeNode childNode = scanDir(f);
                    node.add(childNode);
                }
            }
            return node;
        }
    
    i nodi si riempiono correttamente.
    però continua a non essere ordinato.
    nel senso che viene ordinato alfabeticamente, me senza mettere prima le directory e poi file.
    ti riposto il comparator, dovesse essere sbagliato la:
    
    public class MyComparator implements Comparator<File> {
    
        @Override
        public int compare(File f1, File f2) {
            if (f1.isFile() && f2.isDirectory()) {
                return 1;
            } else if (f1.isDirectory() && f2.isFile()) {
                return -1;
            } else {
                return f1.getName().compareTo(f2.getName());
            }
        }
    }
    
  • Re: Problema con list file e sort

    fermat ha scritto:


    ti riposto il comparator, dovesse essere sbagliato la:
    Il comparator mi pare corretto. Tieni presente che è case-sensitive. Un file PROVA.TXT viene prima di un ciao.txt
  • Re: Problema con list file e sort

    andbin ha scritto:


    fermat ha scritto:


    ti riposto il comparator, dovesse essere sbagliato la:
    Il comparator mi pare corretto. Tieni presente che è case-sensitive. Un file PROVA.TXT viene prima di un ciao.txt
    si ho notato.
    ma potrebbe anche andare bene così.
    il problema è un altro.
    in sostanza dentro la directory iniziale ho (ad esempio):
    
    add-ons (directory)
    build-tools (directory)
    platform (directory)
    skins (directory)
    samples (file)
    
    nel jtree mi arrivano così:
    
    add-ons (directory)
    build-tools (directory)
    platform (directory)
    samples (file)
    skins (directory)
    
    quindi non mi mettere prima tutte le directory.
  • Re: Problema con list file e sort

    Sempre e solo per il primo livello cmq.
    le altre sotto directory vengono ordinate bene.
  • Re: Problema con list file e sort

    Scusa scemenza mia.
    samples in verità è una directory.
    ma essendo vuota mi metteva l'icona del ramo che non ha figli.

    a questo punto direi che funziona tutto.
    grazie!
Devi accedere o registrarti per scrivere nel forum
9 risposte