level31.lesson02.home02

/* Находим все файлы
Реализовать логику метода getFileTree, который должен в директории root найти список всех файлов включая вложенные.
Используйте очередь, рекурсию не используйте.
Верните список всех путей к найденным файлам, путь к директориям возвращать не надо.
Путь должен быть абсолютный.
*/

package com.javarush.test.level31.lesson02.home02;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Solution
{

    public static void main(String[] args) throws IOException
    {
        List<String> list = getFileTree("C:\\Users\\1\\Downloads\\JavaRushHomeWork\\JavaRushHomeWork\\test");
        for (int i = 0; i < list.size(); i++)
        {
            System.out.println(list.get(i));
        }
    }

    public static List<String> getFileTree(String root) throws IOException
    {
        List<File> allDir = new LinkedList<>();
        List<String> allFiles = new ArrayList<>();
        File file = new File(root);

        for (File entry : file.listFiles()
                )
        {
            if (entry.isFile()) allFiles.add(entry.getAbsolutePath());
            else allDir.add(entry);
        }

        while (!allDir.isEmpty())
        {
            for (File folder : allDir
                    )
            {
                for (File search : folder.listFiles()
                        )
                {
                    if (search.isFile()) allFiles.add(search.getAbsolutePath());
                    else allDir.add(search);
                }
            }
            allDir.remove(0);
        }
        return allFiles;
    }
}


Вывод:
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\1.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\3.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\6.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\7.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\123\12333.txt

Перед отправкой на сервер main удаляю. Не принимается. Подскажите, что не так?

10 комментариев

lichMax
А зачем удаляешь? Я не удалял. Может всё-таки в этом дело?
lichMax
Ещё одно: а что очередь не использовали? Вроде как замена рекурсии — очередь. Хм.
saudabaew
Делаю без рекурсии. В качестве очереди использую LinkedList.
Main в условии задачи отсутствует, написал его для тестирования.
CreaT1ve
Вас просят использовать именно очередь, т.е. LinkedQueue, к примеру.
Старайтесь делать все так, как говорится в условии.
lichMax
Я всегда в таких задачах в качестве очереди использовал ЛинкедЛист. И всё проходило.
CreaT1ve
Я тоже не помню, есть ли в этой задаче какие-нибудь наклоности у валидатора или нет. Просто отметил, что решение строго должно быть по условию.
Тем более трудно сказать, в чем проблема, когда по JR1 решается задача и нету намека, в какую сторону смотреть.
saudabaew
Исходя из информации в интернете, я так понял, что LinkedList можно использовать в качестве очереди. Пример:
«Обобщенный класс LinkedListпредставляет структуру данных в виде связанного списка. Он наследуется от класса AbstractSequentialList и реализует интерфейсы List, Dequeue и Queue.»
metanit.com/java/tutorial/5.3.php
lichMax
  • lichMax
  • +1
  • Комментарий отредактирован 2017-09-14 15:52:51 пользователем lichMax
Исходя из информации в интернете… Да уж. Первое — смотрите исходники джавы. Второе — смотрите ораколовскую документацию по Джаве (туториалы и джавадоки, например, тыц
)
Уже из того, что он, LinkedList, реализует интерфейс queue и deque, понятно, что его можно использовать в качестве очереди. Также в качестве очереди можно использовать ArrayDeque и PriorityQueue.

PS Кстати, хороший сайт, ссылку на которой Вы привели. Но работать с исходниками джавы и документацией от оракла тоже надо
saudabaew
Спасибо всем, кто откликнулся.
В итоге получилось решить используя методы Queue.
Как я понял, проблема была в модификации LinkedList во время его просмотра, что порождало СoncurrentModificationException.
lichMax
Не помню, чтобы у меня возникала такая проблема. Но я естественно всегда использую цикл while, когда работаю с очередями.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.