2014-12-02 3 views
0

У меня есть массив File [] polFiles. Некоторые файлы могут быть удалены другой функцией, и я пишу функцию для очистки удаленных файлов из массива. Например, если в файлах [] polFiles были P0, P1, P2, P3, P4 и были удалены с помощью P1 и P2, теперь polFiles должен состоять из P0, P2 и P4. Как это сделать? Я написал простой код, но он бросает любые исключения и ошибки.Java - удалить некоторые файлы из файла [] array

int delcount = 0; 
for (File file : files) { 
    if (!file.exists()) { 
     delcount++; 
    } 
} 
File[] newfiles = new File[files.length-delcount]; 
int fcount = 0; 
for (int i = 0; i < newfiles.length; i++) { 
    if (!files[i].exists()) { 
     fcount++; 
     for (int j = i; j < files.length-fcount-1; j++) { 
      newfiles[j] = files[j+fcount]; 
     } 
    } else { 
     newfiles[i] = files[i+fcount]; 
    } 
} 
System.arraycopy(newfiles, 0, files, 0, newfiles.length); 
for (int i = newfiles.length; i < files.length; i++) { 
    files[i] = null; 
} 

Где ошибка? Этот код генерирует исключение Null и не работает корректно. Он удаляет только первый файл из массива

+0

Любая причина, по которой вы используете массив, а не 'Список'? – RealSkeptic

+0

Если вы должны использовать массивы, вам нужно будет добавить восстановленные файлы в новый массив, а затем сжать его (в третий массив) ... – MadProgrammer

+0

@RealSkeptic file array используется другой программой – Denis

ответ

2

Если вы хотите сделать это без помощи библиотек, то, попробовать что-то вроде следующие:

private File[] compactor(File[] files) { 
    int deleted = 0; 
    for (int i = 0; i < files.length; i++) { 
     File file = files[i]; 
     if (file.exists()) { 
      files[i - deleted] = file; 
     } else { 
      files[i] = null; 
      deleted++; 
     } 
    } 

    int nSize = files.length - deleted; 
    File[] newFiles = new File[nSize]; 
    if (nSize > 0) { 
     System.arraycopy(files, 0, newFiles, 0, newFiles.length); 
    } 
    System.out.println(Arrays.toString(newFiles)); 
    return newFiles; 
} 

Просто проверьте, не нужно ли добавлять граничные условия.

3

Гораздо проще работать с List с, чем с массивами. Если у вас есть уважительная причина, отпустил массив ... С некоторой помощью Guava это становится гораздо проще:

FluentIterable.from(files) 
    .filter(new Predicate<File>() { 
     @Override 
     public boolean apply(@Nullable File file) { 
      return file.exists(); 
     } 
    }).toList(); 
Смежные вопросы