deviceIds의 목록이 주어지면보다 효율적인 중복 처리 방법을 찾으려고합니다. deviceId 목록에 중복 파일이 있으면 최신 파일 만 유지하고 다른 파일은 삭제해야합니다. 지금까지 무엇을 생각해 냈는지 알았지 만 더 효율적으로 만들 수 있는지 궁금한가요? 현재의 방법은 확장 성이 좋지 않습니다. 예를 들어 5 초 만에 25,000 개의 파일을 처리하지만 100,000 개의 파일에는 70 초가 걸립니다. 이견있는 사람?파일을 필터링하는보다 효율적인 방법을 찾으려고 시도합니다.
List<File> filteredList;
for(int i = 0; i < deviceIds.size(); i++) {
if(i < (deviceIds.size()-1) && deviceIds.get(i).equals(deviceIds.get(i+1))) {
filteredList = Lists.newArrayList(Iterables.filter(fileList, new DeviceIdFilter(deviceIds.get(i))));
Collections.sort(filteredList, new OldestFileComparator());
for(int t = 0; t < (filteredList.size()-1); t++) {
filteredList.get(t).delete();
}
}
}
private static class DeviceIdFilter implements Predicate<File> {
private String deviceId;
private DeviceIdFilter(final String deviceId) {
this.deviceId = deviceId;
}
@Override
public boolean apply(final File file) {
return file.getName().contains(deviceId);
}
}
public class OldestFileComparator implements Comparator<File> {
public int compare(File filea, File fileb) {
if (filea.lastModified() > fileb.lastModified()) {
return +1;
} else if (filea.lastModified() < fileb.lastModified()) {
return -1;
} else {
return 0;
}
}
}
편집 :
나는 멋지고 일 TacticalCoders 솔루션, 가공 0.60 초에서 10 만 개 파일을 구현했습니다.
Map<String, List<File>> fileMap = new HashMap<String,List<File>>();
String deviceId;
List<File> deviceFileList;
for(File file : fileList) {
deviceId = getDeviceId(file.getName());
if(fileMap.containsKey(deviceId)) {
fileMap.get(deviceId).add(file);
} else {
deviceFileList = new LinkedList<File>();
deviceFileList.add(file);
fileMap.put(deviceId, deviceFileList);
}
}
for (Map.Entry<String, List<File>> mapEntry : fileMap.entrySet()) {
deviceFileList = mapEntry.getValue();
if(deviceFileList.size() > 1) {
Collections.sort(deviceFileList, new OldestFileComparator());
for(int t = 0; t < (deviceFileList.size()-1); t++) {
deviceFileList.get(t).delete();
}
}
당신의 목록을 더 작은 것들 (25,000 등)로 나누는 방법을 당신의 sort 메쏘드가 할 수 있고, 그 다음 메르코수르 종류의 알고리즘과 병합합니다. –
더 간단한 비교기는'filea.lastModified(). compareTo fileb.lastModified())'. 빠르지 않고, 조금만 청소하십시오. 그러나 null을주의하십시오 (구현시에도 문제가 있음). –