Цель: отсортировать Set по возрастанию имен файлов из переданных полных путей до файла.
Проблема: реализую интерфейс Comparator<String> у главного класса и переопределяю метод int compare, но почему-то мой Set игнорирует логику в переопределенном методе compare и использует стандартную реализацию для сравнивания строк. Смог добиться нужного результат только с помощью создания дополнительного класса, который реализует Comparator<String> и указал в при инициализации Set этот класс как компоратор, который нужно использовать. (в коде закомментированная строка // TreeSet<String> treeSet = new TreeSet<>(comparator); )
Вопрос: почему Set не использует метод compare который я переопределил?
Ожидаемый вывод:
F:\ttt\sdf\a.txt
F:\ttt\b.txt
F:\ttt\c.txt
F:\ttt\fwef\d.txt
F:\ttt\k.txt
F:\ttt\z.txt
__________
public class Testiki implements Comparator<String> {
private static TreeSet<String> treeSet = new TreeSet<>();
public static void main(String[] args) throws IOException {
/*
Цель: отсортировать Set по возрастанию имен файлов из
переданных полных путей до файла
*/
Comparator<String> comparator = new compareByFileName();
//TreeSet<String> treeSet = new TreeSet<>(comparator);
treeSet.add("F:\\ttt\\c.txt");
treeSet.add("F:\\ttt\\b.txt");
treeSet.add("F:\\ttt\\sdf\\a.txt");
treeSet.add("F:\\ttt\\fwef\\d.txt");
treeSet.add("F:\\ttt\\z.txt");
treeSet.add("F:\\ttt\\k.txt");
treeSet.forEach(System.out::println);
System.out.println("__________");
}
@Override
public int compare(String o1, String o2) {
String firstFileName = o1.substring(o1.lastIndexOf("\\") + 1);
String secondFileName = o2.substring(o2.lastIndexOf("\\") + 1);
return firstFileName.compareTo(secondFileName);
}
}
class compareByFileName implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
String firstFileName = o1.substring(o1.lastIndexOf("\\") + 1);
String secondFileName = o2.substring(o2.lastIndexOf("\\") + 1);
return firstFileName.compareTo(secondFileName);
}
}