Нет более эффективного.Алгоритм должен будет проверить каждый файл, если его расширение равно единице, чего раньше не было.Так что лучший алгоритм будет иметь сложность O(n)
.
Повторение во всех каталогах и добавление расширений всех файлов в Set
- это лучшее, что мы можем сделать, на мой взгляд.
Драматическое усиление может быть побочным эффектом неправильного использования HashMap
;) Я вижу, что вы перебираете весь набор вместо использования метода содержимого.Если вы сделали , что в исходной версии верно, тогда мне ясно, что производительность была сомнительной.
Я все еще ожидаю, что извлечение расширений и просто добавление их в HashSet
является наиболее эффективным решением:
static String[] filenames = { "edit.txt", "my.notes.txt", "sheet.xlxs",
".bash", "README" };
static HashSet<String> exts = new HashSet<>();
public static void main(String[] args) {
// we add every extension to a hashset
for (String filename : filenames) {
exts.add(getExtension(filename));
}
// just dumps the set contents
for (String ext: exts) {
System.out.println(ext);
}
}
private static String getExtension(String filename) {
String ext = "";
// calculate the index only once
int lastIndexOfDot = filename.lastIndexOf('.');
// "README" and ".bash" are files with no extension!
if (lastIndexOfDot > 0) {
exts.add(filename.substring(lastIndexOfDot));
}
return ext;
}