Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Алгоритм сортировки файлов из нескольких папок. / 13 сообщений из 13, страница 1 из 1
02.10.2018, 12:21
    #39711573
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
Есть 2 и более папки. В них есть файлы. Нужно отсортировать это все дело в один список таким образом что бы:

1 файл из первой папки, 1 файл из второй папки .... a файл из n папки.

Сейчас сделал банально случайную выборку из каждой папки. Собрал это все в кучу. Потом так же рандомно сортирую, только уже все вместе. Получается не очень.

Подскажите как можно сделать? ибо у самого чет не доходят мозги до этого.
...
Рейтинг: 0 / 0
02.10.2018, 12:40
    #39711587
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
сортировка слиянием?
...
Рейтинг: 0 / 0
02.10.2018, 12:53
    #39711602
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
забыл ник, слить все в одно и отсортировать?
...
Рейтинг: 0 / 0
02.10.2018, 13:04
    #39711611
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
Сделал такую штуку:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
               List<File> result = new ArrayList<>();

                File mostFullFolder = folders.stream()
                        .max(Comparator.comparingInt(o -> o.listFiles() != null ? o.listFiles().length : 0)).orElse(null);

                for(int i=0;i<(mostFullFolder.list()!=null?mostFullFolder.list().length:0);i++) {

                    for (File folder : folders) {

                        if (folder != null) {

                            try {

                                File file = folder.listFiles() != null ? folder.listFiles()[i] : null;

                                if (file != null) {
                                    result.add(file);
                                }

                            } catch (ArrayIndexOutOfBoundsException e) {
                                // IGNORE INDEX
                            }

                        }

                    }

                }

                LOGGER.info(Arrays.deepToString(result.toArray()));



Нормально? или можно как-то улучшить алгоритм?
...
Рейтинг: 0 / 0
02.10.2018, 13:04
    #39711612
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
folders - List<File>, получаю в методе сортировке.
...
Рейтинг: 0 / 0
02.10.2018, 13:37
    #39711642
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
1) Зачем сортировать файлы а не их имена(строки)
2) Возьми замапь все файлы на их имена, и положи в SortedSet

Код: java
1.
2.
3.
list<String> names = folders.map(_.getName)
SortedSet<String> set = new TreeSet<>();
set.addAll(names)


3) Код ужасный конечно...
...
Рейтинг: 0 / 0
02.10.2018, 14:03
    #39711663
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
забыл ник, зачем мне это? файлы разные в каждой папке. Требование - что бы были файли последовательные, как я описывал выше. А не вразброс. Главное что бы не попадались файлы из одной и той же папки не более чем раз. Чем ужасен? агрументируйте.
...
Рейтинг: 0 / 0
02.10.2018, 14:05
    #39711664
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
забыл ник2) Возьми замапь все файлы на их имена, и положи в SortedSet
Код: java
1.
2.
3.
list<String> names = folders.map(_.getName)
SortedSet<String> set = new TreeSet<>();
set.addAll(names)




Походу цель задачи даже не читали.
...
Рейтинг: 0 / 0
02.10.2018, 14:17
    #39711683
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
Tsyklop
Походу цель задачи даже не читали.

Читал, но в очередной раз сделал типичную ошибку - когда непонятно - додумал.

Решительно непонятно, как совмещаются вот эти требования, и что вообще надо
авторНужно отсортировать это все дело в один список таким образом что бы:

1 файл из первой папки, 1 файл из второй папки .... a файл из n папки.
авторТребование - что бы были файли последовательные, как я описывал выше. А не вразброс. Главное что бы не попадались файлы из одной и той же папки не более чем раз

Абстрагируясь от деталей, все же непонятно, почему сортировать(если тут дейтсвительно сортировка) именно файлы, а не их имена? Потом файл можно легко прочитать по имени, ну это лирика.

авторЧем ужасен? агрументируйте.
Сначала общие для всех Java-программ
1) Мешанина стримов и прямой итерации, я бы делал конечно на стримах, но можно и через for(), но мешать это совсем ни о чем
2) catch ArrayIndexOfBoundException это вообще никакой код ревью пройти не может
3) Все эти проверки на нулл просто засоряют понимание того что код делает. Фильтруйте все раньше

Ну и как приверженец ФП, я бы конечно еще избавился от mutable переменных, 99% все можно решить через однострочный стрим, но это уже на любителя
...
Рейтинг: 0 / 0
02.10.2018, 14:29
    #39711700
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
забыл ник, Есть 3 папки. В каждой папке есть файлы. Мне нужно отсортировать файлы из этих папок таким образом:
файл из первой папки, файл из второй папки, файл из первой, из второй и т.д. На счет имен согласен, можно же получить массив строк - file.list() .

Додумывать зачем? вы человек, а не обезьяна, разговаривать умеете. (без обид).

На счет кода. Отсортируй мне таким образом файлы или же строки на стримах. НО! что бы это было максимально не ресурсно затратно. Я убрал стрим, который выше привел - сразу уменьшилось использование памяти на 5 MB.

По коду:
1. Если вы словите ArrayIndexOutOfBoundsException у вас вылетит все, а значит что? цель не будет выполнена.
2. Знаете что listFiles() и даже list() могут кинуть null . где же это до этого "отфильтровать"?
3. В папках может быть разное кол-во файлов. К примеру, в первой папке 100 файлов, во второй 150. Вы будете брать большее число. И если вы захотите дернуть 101 файл (или строку) будет эксепшн выхода за границы массива. Как решать?
...
Рейтинг: 0 / 0
02.10.2018, 15:06
    #39711738
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
TsyklopПодскажите как можно сделать?
Банальный обход в ширину. Погуглите по фразе.
...
Рейтинг: 0 / 0
02.10.2018, 15:20
    #39711748
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
TsyklopПо коду:
1. Если вы словите ArrayIndexOutOfBoundsException у вас вылетит все, а значит что? цель не будет выполнена.
2. Знаете что listFiles() и даже list() могут кинуть null . где же это до этого "отфильтровать"?
3. В папках может быть разное кол-во файлов. К примеру, в первой папке 100 файлов, во второй 150. Вы будете брать большее число. И если вы захотите дернуть 101 файл (или строку) будет эксепшн выхода за границы массива. Как решать?

ArrayIndexException и количество файлов в папке абсолютно ортогонально к решаемой проблеме, это искууствуенно введенные вами же ограничения, с которыми вы активно боретесь. На Java, сложно написать хороший код, на Scala бы я отсортировал листы по количеству эдементов и обошелся одним foldLeft. Вот более-менее приличная версия на Java(жалко больше времени тратить), правда она основана на рекурсии и если папок много - то может и свалиться. Тогда надо делать менее красиво, через тот же обход в ширину, как уже подсказали

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
package test;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

public class Test {

    @Data
    @AllArgsConstructor
    static class State {
        int index = 0;
        List<List<String>> remaining = new ArrayList<>();
        List<String> sorted = new ArrayList<>();
    }

    public static void main(String[] args){
        List<String> folders1 = new ArrayList<String>() {{
            add("A");
            add("B");
            add("C");
        }};
        List<String> folders2 = new ArrayList<String>() {{
            add("A1");
            add("B1");
        }};
        List<String> folders3 = new ArrayList<String>() {{
            add("A2");
            add("B2");
            add("C2");
            add("D2");
        }};
        List<String> folders4 = new ArrayList<String>() {{
            add("A3");
        }};

        List<List<String>> all = new ArrayList<List<String>>() {{
            add(folders1);
            add(folders2);
            add(folders3);
            add(folders4);
        }};
        State state = new State(0, all, new ArrayList<>());
        System.out.println(sort(state));
    }

    static List<String> sort(State state) {
        if(state.remaining.size() == 0) return state.sorted;
        else {
            List<String> sorted = state.sorted;
            List<List<String>> remaining = new ArrayList<>();
            for (List<String> list : state.remaining) {
                if(list.size() > state.index) {
                    sorted.add(list.get(state.index));
                    remaining.add(list);
                }
            }
            return sort(new State(state.index + 1, remaining, sorted));
        }
    }
}
...
Рейтинг: 0 / 0
02.10.2018, 15:31
    #39711760
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм сортировки файлов из нескольких папок.
забыл ник, Забыл сказать. В этих папках не будет папок, только файлы mp3.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Алгоритм сортировки файлов из нескольких папок. / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]