Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
boott
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 2
#1

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

18.10.2012, 16:32. Просмотров 3715. Ответов 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
Ответы с готовыми решениями:

Преобразовать элемент в числе без цикла и без рекурсии
Доброго времени суток. Вопрос такой, как преобразовать элемент в целом числе,...

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

События файловой системы
Есть такая задача: реагировать на изменения в указанных файлах. Всё, что я...

Рекурсивный обход файловой системы
Я ужо замучалась. Мне надо распечатать все файлы и папки с локального диска С....

Отображение файловой системы в виде xml !
Всем привет! Дали задание: отобразить файловую систему в виде хмл на джаве,...

4
turbanoff
Эксперт Java
4016 / 3751 / 741
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 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Эксперт С++
8326 / 3546 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
23.10.2012, 16:59 #4
boott, подобная задача легко решается через стек. Со списками - ну очень уж на велосипед смахивает
0
turbanoff
Эксперт Java
4016 / 3751 / 741
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 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

Отображение файловой системы в виде xml !
Всем привет! Дали задание: отобразить файловую систему в виде хмл на джаве,...

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

Быстрая сортировка без рекурсии
КАК решить быструю сортировку без рекурсии на языке java, очень очень...


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

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

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