В прошлой статье "Поиск файлов" мы начали…
В прошлой статье "Поиск файлов" мы начали разработку небольшой библиотеки для поиска файлов. На данный момент мы можем найти файлы, но не можем упорядочить результаты поиска. В этой статье я покажу, как создать класс, который позволит сортировать список файлов любым, удобным нам, способом. Вступление Прежде всего, нам нужно определиться, что мы будем сортировать, и как. Наш класс для поиска файлов имеет несколько методов find(…), которые возвращают список файлов (объект типа List) с объектами типа File. Таким образом, мы можем получить любую информацию о найденных файлах (имя, размер, размещение и т. д.). Теперь решим, каким образом нам нужно отсортировать результаты поиска. Наиболее часто требуется сортировка по имени, типу, размеру и дате создания файла. В этой статье мы напишем методы, необходимые для сортировки по имени файла (это одна из наиболее сложных сортировок). Итак, нам нужно, отсортировать все найденные файлы и папки в следующем порядке:
- первыми идут файлы с минимальной глубиной вложения (т. е. те, которые находятся ближе к начальной папке поиска); файлы, которые находятся внутри одной папки, должны быть отсортированы в алфавитном порядке (нужно обеспечить правильную обработку не латинских символов).
Результаты сортировки должны быть возвращены в виде списка (List) с объектами типа File, т. е. мы меняем только порядок следования элементов и ничего более. Сортировка списка файлов на Java Теперь, когда задача ясна, посмотрим, как мы можем её решить. В первую очередь, нам нужен какой-нибудь алгоритм сортировки. С этим проблем нет. На сегодняшний день, разработано множество таких алгоритмов. Парочку этих алгоритмов можно найти практически в любом учебнике по программированию. Так что, если хотите, берите книжку…, или можно воспользоваться стандартной библиотекой Java, конкретнее, методом sort(List list, Comparator c) класса Collections из пакета java. util. Этот метод выполняет сортировку списка объектов, который передается ему в первом параметре (list). Тут у вас может возникнуть вполне закономерный вопрос: "А как именно он будет сортировать файлы". Ответ простой: "Так, как мы ему расскажем":-). Дело в том, что любой алгоритм сортировки принимает решения о порядке следования объектов на основании результатов их сравнения, т. е. при сортировке мы всегда должны иметь возможность получить результат сравнения двух любых объектов. Например, если бы мы сортировали список с объектами стандартного типа, например, int, то метод sort упорядочил бы их в порядке возрастания без дополнительных усилий с нашей стороны. Но о том, как мы хотим отсортировать наш список, методу sort ничего не известно. Поэтому мы должны написать метод, который выполняет сравнение двух объектов из нашего списка. Этот метод (int compare(Object o1, Object o2)) определён в интерфейсе Comparator. Он должен возвращать «1», если первый аргумент (o1) больше второго (o2), «0» – если аргументы равны, и «-1» – если второй объект больше. Как вы, наверное, уже поняли, указатель на класс, который содержит наш метод сравнения (compare(…)) передаётся методу sort во втором параметре. Метод sort будет сортировать наши объекты в порядке возрастания, сравнивая их при помощи нашего метода compare(…). Изменяя метод compare(…) мы можем задать любой порядок сортировки. Теперь посмотрим как будет выглядеть наш класс сортировки файлов (FileSorter)