Ordinamento dell'array prima del ciclo: best practice

1

Stavo passando attraverso il codice JBAKE

link : 58

PFB il codice.

Perché stiamo ordinando l'array qui?

    if (assets != null) {
        //TBD : Why is sorting required?
        Arrays.sort(assets);
        for (int i = 0; i < assets.length; i++) {
            if (assets[i].isFile()) {
                StringBuilder sb = new StringBuilder();
                sb.append("Copying [" + assets[i].getPath() + "]...");
                File sourceFile = assets[i];
                File destFile = new File(sourceFile.getPath().replace(source.getPath()+File.separator+config.getString(ConfigUtil.Keys.ASSET_FOLDER), destination.getPath()));
                try {
                    FileUtils.copyFile(sourceFile, destFile);
                    sb.append("done!");
                    LOGGER.info(sb.toString());
                } catch (IOException e) {
                    sb.append("failed!");
                    LOGGER.error(sb.toString(), e);
                    e.printStackTrace();
                    errors.add(e.getMessage());
                }
            }

            if (assets[i].isDirectory()) {
                copy(assets[i]);
            }
        }
    }
    
posta Mohit Kanwar 06.12.2015 - 14:02
fonte

1 risposta

2

Il comparatore di File esegue un confronto lessicografico dei percorsi. Quindi, questi file sono ordinati per nome. Quindi, ovviamente, l'autore vuole che l'albero del filesystem sia attraversato in ordine alfabetico e non in nessun altro ordine. Questo è importante, perché secondo la documentazione di File.listFiles() :

There is no guarantee that the name strings in the resulting array will appear in any specific order; they are not, in particular, guaranteed to appear in alphabetical order.

Java si astiene specificamente dal dare tale garanzia perché è noto che diversi ambienti host (cioè Windows vs. Linux) producono file in ordini diversi, e talvolta persino l'ambiente host può astenersi dal fornire tale garanzia. D'altra parte, l'ordinamento dei file può essere costoso, quindi i creatori di Java hanno deciso di passare questa incertezza al programmatore, piuttosto che imporre il sovraccarico extra di ordinamento su ogni singola applicazione Java.

Quindi, l'autore vuole avere un ordine garantito in cui i file saranno attraversati. Questo è utile:

  • Durante il debug, poiché il comportamento del programma non cambia da esecuzione di debug a esecuzione di debug a causa di fattori che sfuggono al tuo controllo. Se noti che il file "aardvark.txt" è stato restituito per primo, e provi a vedere cosa succede quando elabori l'aardvark e imposti un punto di interruzione in qualche punto e riesegui, è molto fastidioso scoprire che alla prossima esecuzione "zoologia". txt "viene elaborato per primo.

  • Durante il test, perché è possibile creare una struttura di directory temporanea, creare un albero di file, eseguire la funzione su di esso, ottenere i risultati in un nuovo albero e quindi assicurarsi che gli alberi siano esattamente uguali , senza dover rendere conto del fatto che gli alberi possono essere uguali ma non nello stesso ordine.

  • In generale, quando scrivi software che vuoi comportarti in modo coerente su piattaforme diverse.

risposta data 06.12.2015 - 15:07
fonte