Форум программистов, компьютерный форум, киберфорум
Наши страницы

Java SE (J2SE)

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.81
boott
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 2
#1

Как обойти дерево файловой системы БЕЗ рекурсии - Java SE

18.10.2012, 16:32. Просмотров 3639. Ответов 4
Метки нет (Все метки)

Подскажите как обойти дерево файловой системы на заданную глубину БЕЗ рекурсии, и найти элементы которые в своем имени содержат определенную маску.
Предложили вариант брать два списка - текущего и следующего уровня. Идти по текущему уровню и все дочерние класть в следующий. После того как прошли - следующий уровень делается текущим. И так до достижения нужной глубины.
По сути у меня сейчас в list список текущего, в folderlist список следующего уровня, но как обойти все дерево на глубину, допустим 2, все равно сообразить не могу
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
64
65
66
67
68
69
70
71
72
73
74
import java.io.*;
public class TestPE {
    // фильтр 
 static class MyFilter implements FilenameFilter {
        
        private String mask;
        public MyFilter(String mask) {
       this.mask = mask;
         }
 
        public boolean accept(File dir, String name) {
        
            
            
        File f = new File (name);
        if (f.getName().contains(mask)){
        return true;
        }
        else {return false;}
            
            
        
        }
 
}
 
 
public static void main (String args []){
      
    String Path = args[0]; 
    //Integer depth_temp =Integer.valueOf(args[1]);
    //int depth = depth_temp.intValue();
        
    String mask = args[1];
    
        File rootPath = new File (Path);
        //Ecли rootPath директория, то получаем список ее файлов. 
        if (rootPath.isDirectory()){
       
         File [] list = rootPath.listFiles(new MyFilter(mask));
 
        /*Для каждого файла папки rootPath, проверяем не является ли она папкой,
         *если является получаем список файлов в folderlist, и выводим его
              
        */
              
        for (int i=0; i<list.length; i++){
            
           if (list[i].isDirectory()){
               
           File [] folderlist = list[i].listFiles(new MyFilter(mask));
           for (int j=0; j<folderlist.length; j++){
           System.out.println(folderlist[j]);
            
           
           }
         
           
           }
            
          System.out.println(list[i]);
        
        
             
        
        }
        }
      
        
   } 
 
 
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2012, 16:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как обойти дерево файловой системы БЕЗ рекурсии (Java SE):

Преобразовать элемент в числе без цикла и без рекурсии - Java SE
Доброго времени суток. Вопрос такой, как преобразовать элемент в целом числе, а именно самый правый 0 в 1, не используя циклы и рекурсию....

События файловой системы - Java SE
Есть такая задача: реагировать на изменения в указанных файлах. Всё, что я нашёл - это класс WatchService из пакета java.nio.file. С его...

Листинг файловой системы - Java
Мне надо проиндексировать файлов. систему при помощи интерфейса (SWING, AWT). Хотелось бы знать возможно ли в одном пакете совместить...

Рекурсивный обход файловой системы - Java SE
Я ужо замучалась. Мне надо распечатать все файлы и папки с локального диска С. Понимаю, что задача двести лет как решена, но я не понимаю...

Отображение файловой системы в виде xml ! - Java SE
Всем привет! Дали задание: отобразить файловую систему в виде хмл на джаве, порядок действий такой: 1) FS info; 2)XML; 3)XSD схема; 4)x......

Отображение файловой системы в виде xml ! - Java
Всем привет! Дали задание: отобразить файловую систему в виде хмл на джаве, порядок действий такой: 1) FS info; 2)XML; 3)XSD схема; 4)x......

4
turbanoff
Эксперт Java
4004 / 3739 / 467
Регистрация: 18.05.2010
Сообщений: 9,316
Записей в блоге: 11
Завершенные тесты: 1
18.10.2012, 16:57 #2
Делаете список файлов, тех которые нужно обойти.
В начале добавляете туда один элемент - корневую папку.
Дальше в цикле перебираете все папки, которые есть в списке. При обходе ложите все дочерние папки в список.
Цикл заканчиваете, когда в списке не осталось файлов.

Под списком подразумевается, любая динамическая коллекция, например ArrayList<File>
1
boott
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 2
18.10.2012, 21:18 #3
Спасибо, пока что получилось реализовать поиск по маске. Теперь возник вопрос как к этому всего прикрутить глубину поиска?
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
 
 
 
 
public class TestPE {
    // фильтр 
 static class MyFilter implements FilenameFilter {
        
        private String mask;
        public MyFilter(String mask) {
       this.mask = mask;
         }
 
        public boolean accept(File dir, String name) {
        
            
            
        File f = new File (name);
        if (f.getName().contains(mask)){
        return true;
        }
        else {return false;}
            
            
        
        }
 
}
 
 
public static void main (String args []){
      
    String Path = args[0]; 
    
        
    String mask = args[1];
        
       // Integer depth_temp =Integer.valueOf(args[2]);
    //int depth = depth_temp.intValue();
        
    
        File rootPath = new File (Path);
       
        if (rootPath.isDirectory()){
       
       
        ArrayList <File> listt = new ArrayList  <File> ();
     
        listt.add(rootPath); 
              
        do {    
        for (int i=0; i<listt.size(); i++){
                       
           if (listt.get(i).isDirectory()){
               listt.addAll(Arrays.asList(listt.get(i).listFiles()));
               
 
                    
           }
         
        
           
           } 
        
      
        }
        while (listt.isEmpty());
      
      File [] all = listt.toArray(new File[listt.size()]);
      
      
      for (int i=0; i<all.length; i++){
      
         if (all[i].isDirectory()){
              
           
           File [] folderlist = all[i].listFiles(new MyFilter(mask));
           for (int j=0; j<folderlist.length; j++){
                             
           System.out.println(folderlist[j]);
                    
           }
          
      
      }
        
        }
      
          
        
        }
        
       
        }
      
        
}
0
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 143
Регистрация: 03.07.2009
Сообщений: 10,708
23.10.2012, 16:59 #4
boott, подобная задача легко решается через стек. Со списками - ну очень уж на велосипед смахивает
0
turbanoff
Эксперт Java
4004 / 3739 / 467
Регистрация: 18.05.2010
Сообщений: 9,316
Записей в блоге: 11
Завершенные тесты: 1
23.10.2012, 17:53 #5
Очередь, стек или список, какая разница где хранить?
не понятно причем здесь упоминание велосипеда...
0
23.10.2012, 17:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2012, 17:53
Привет! Вот еще темы с ответами:

Зацикливание при чтении объекта из файловой системы - Java SE
Такая проблема. Читаю файл из файловой системы. Перед этим проверяю существует ли файл. public static AdministratorCaching...

Быстрая сортировка без рекурсии - Java SE
КАК решить быструю сортировку без рекурсии на языке java, очень очень срочно....вопрос жизни и смерти????

Stack Overflow без рекурсии - Java SE
Предложили такую задачку. Надо написать программу, которая кидает SO, использовать рекурсию нельзя. Если вдруг кому-то тоже интересно,...

Вычисление факториалов больших чисел, без рекурсии - Java SE
public static void main(String args) { BigInteger bi1, bi2, bi3; int n = 20; bi1 = new BigInteger(&quot;1&quot;); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru