Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: static метод, рекурсия и как вытащить данные  (Прочитано 17362 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mitia
Гость
« : 14-03-2006 07:44 » 

Значит имеется метод, разворачивающий каталоги. Если в него добавить return,то он вернет значение от первого запуска showDir и в конце своей работы, т.е. когда все каталоги развернет. Вопрос - как вытащить путь к файлу из этого метода и остановить выполнение(что-то типа break), если это возможно.


Код:
static void showDir(int indent, File file) throws IOException {
//File file = new File(filename);

for (int i = 0; i < indent; i++)
      System.out.print('-');
    System.out.println(file.getName());
    if(file.getName().startsWith("AM") && file.getName().endsWith("jnlp")){
  //System.out.println("Пойман засранец!"+file.getAbsolutePath());
    // JNLPPath = file.getAbsolutePath();
    }
    if (file.isDirectory()) {
      File[] files = file.listFiles();
      for (int i = 0; i < files.length; i++)
        showDir(indent + 4, files[i]);
    }
    //"NOTHING";
  }
« Последнее редактирование: 15-12-2007 22:04 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 14-03-2006 08:35 » 

ничего не понятно с блоками циклов Улыбаюсь Приведи в порядок при помощи {} , а потом.

и ещё - рекурсивные вызовы лучше с счётчиком делать, который с инкрементом передавать в новый вызов. -> контроль вложенности + определяется первый вызов (счётчик==0)

пусть функция возвращает не void, а значение, указатель etc.
Выход - return ...

Записан

Mitia
Гость
« Ответ #2 : 14-03-2006 10:31 » 

Так я ж говорю, что если поставить return в if(file.getName().startsWith("AM") && file.getName().endsWith("jnlp")), то он может и возвращает, но как его выловить, как возвращенные данные взять... которые вернул 101ый вызов метода.... У меня получается только первый возов отловить...

А что там с блоками циклов? - все работает. Вот пример: http://www.java2s.com/Code/Java/File-Input-Output/ReadingandPrintingaDirectoryHierarchy.htm


Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 14-03-2006 10:48 » 

да с блоками - фиг с ними, глаза разбегаются только.


а узнать, что вернул так (я на своём примере):
Код:
bool Find(mytype*& pMT ,BYTE byCount)
{
   if(!byCount)
   {
      //первый вызов
      *pMT=0;
   }
  
  
   if(byCount==7)
   {
     //седьмой идёт уж вызов
    
      if(/*что-то проверяем*/)
      {
         *pMT= & (объект типа mytype);
          return true;
      }
      else
      {
          return false;
      }
  }

  //потребовалась рекурсия
  return Find(pMT ,Count+1);
  
}

вызов:

mytype* pMT;

if( Find(pMT,0) && pMT)
{
   //нашли, (*pMT) - тут результат
}
else
{
  //не нашли
}


« Последнее редактирование: 14-03-2006 10:52 от Алексей1153 » Записан

Mitia
Гость
« Ответ #4 : 14-03-2006 10:56 » 

Ага, глянул... Я понял логику - заносим в память и возвращаем true. Только вот неувязочка - у меня Java и там надо немного по иному это сделать. Притом что в static методе я не могу использовать не локальную переменную...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 14-03-2006 11:03 » 

а, упс, про яву ничего не знаю, увлёкся Улыбаюсь
ну указатели-то там есть?

идея такая: передаём в процедуру начальные условия поиска (в примере моём - нету их), передаём указатель, который будет указывать на самый нужный нам результат. Если процедура вернула true - используем указатель, он указавает на верный объект. Если false - обломались
Записан

Mitia
Гость
« Ответ #6 : 14-03-2006 11:08 » 

УКАЗАТЕЛЕЙ В ЖАБЕ НЕТУ!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 14-03-2006 11:19 » 

хм... как вы там живёте?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 14-03-2006 11:22 » 

хорошо, пусть процедура возвращает не bool, а то, что ищется
Записан

Mitia
Гость
« Ответ #9 : 14-03-2006 11:37 » 

Ну вот я сделал с return:

Код:
	static String/*void*/ showDir(int indent, File file) throws IOException {
//File file = new File(filename);

for (int i = 0; i < indent; i++)
      System.out.print('-');
    System.out.println(file.getName());
    if(file.getName().startsWith("AM") && file.getName().endsWith("jnlp")){
    System.out.println("Пойман засранец!"+file.getAbsolutePath());
    // JNLPPath = file.getAbsolutePath();
    return file.getAbsolutePath();
    }
    if (file.isDirectory()) {
      File[] files = file.listFiles();
      for (int i = 0; i < files.length; i++)
        showDir(indent + 4, files[i]);
    }
    return "NOTHING";
  }

Вызываю так:
System.out.println("!!!"+showDir(1, new File("F:\\Documents and Settings\\M\\Application Data\\Sun\\Java\\Deployment\\cache\\javaws\\http\\Dusers.xith.org\\")));
      

Вот результат:

-Dusers.xith.org
-----P80
---------DMJavaCoolDude
-------------DMJWS
-----------------DMlib
---------------------RMdisplaySettings.jar
---------------------RMjogl-win32-native.jar
---------------------RMjogl-win32.jar
---------------------RMvecmath.jar
---------------------RMxith3d.jar
---------------------RNjogl-win32-native.jar
-------------------------jogl.dll
---------------------RTdisplaySettings.jar
---------------------RTjogl-win32-native.jar
---------------------RTjogl-win32.jar
---------------------RTvecmath.jar
---------------------RTxith3d.jar
-----------------DMXith3D
---------------------DMframework
-------------------------898
-------------------------ALXith3DFrame.jnlp
-------------------------AMXith3DFrame.jnlp
Пойман засранец!F:\Documents and Settings\M\Application Data\Sun\Java\Deployment\cache\javaws\http\Dusers.xith.org\P80\DMJavaCoolDude\DMJWS\DMXith3D\DMframework\AMXith3DFrame.jnlp
-------------------------ATXith3DFrame.jnlp
-------------------------RMtinylogo.gif
-------------------------RMXith3DFrame.jar
-------------------------RMxith3dlogo.jpg
-------------------------RTtinylogo.gif
-------------------------RTXith3DFrame.jar
-------------------------RTxith3dlogo.jpg
!!!NOTHING



Мне надо наружу вытащить "F:\Documents and Settings\M\Application Data\Sun\Java\Deployment\cache\javaws\http\Dusers.xith.org\P80\DMJavaCoolDude\DMJWS\DMXith3D\DMframework\AMXith3DFrame.jnlp"
« Последнее редактирование: 15-12-2007 22:06 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 14-03-2006 11:40 » 

...
return showDir(indent + 4, files[ i]);
...
Записан

Mitia
Гость
« Ответ #11 : 14-03-2006 11:47 » 

ну и в чем умор?

Вот результат:
P80
-Dusers.xith.org
-----P80
---------DMJavaCoolDude
-------------DMJWS
-----------------DMlib
---------------------RMdisplaySettings.jar
!!! NOTHING

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 14-03-2006 11:50 » 

отлаживай, я только идею выдал Улыбаюсь
алгоритм придумывать мне немного некогда Ага

у тебя дебаггер есть?
проследи, где теряется найденная строка
Записан

Hoha
Гость
« Ответ #13 : 14-03-2006 12:36 » 

Поиск:

Код:
public void find(File root, String pattern, List<File> result) {
     if (root.isDirectory()) {
         for (File child : root.listFiles()) {
             find(child, pattern, result);
         }
     } else {
         if (root.getName().matches(pattern)) {
             result.add(root);
         }
     }
}

Вызываем:

Код:
List<File> resultAMs = new ArrayList<File>();

find(new File("."), "AM.*\\.jnlp", resultAMs);

for(File file : resultAMs){
    System.out.println(file.getPath());
}

Поиск первого подходящего (а не всех, как выше) оставим в качестве дом. занятия.
Рекомендую ознакомится с рекурсией - в библиотеке форума есть статьи Alf'а по этому поводу.

P.S. Насчет указателей в Java ты, мягко говоря, загнул  Улыбаюсь.
« Последнее редактирование: 15-12-2007 22:07 от Алексей1153++ » Записан
Mitia
Гость
« Ответ #14 : 14-03-2006 12:51 » 

Разве загнул? Просвети - я только учусь Улыбаюсь

По поводу старого примера - я уже пытаюсь сделать, чтобы каждый новый вызов метода возвращал значение... но что-то не очень... лана, будем искать и смотреть статьи.
Записан
Hoha
Гость
« Ответ #15 : 14-03-2006 14:55 » 

Вообще ты прав - это не указатели С++. Просто Алексей1153 мог подумать, что нет ссылочного типа как такового. Ссылки (pointer и reference в Java - синонимы, см. указатель к спецификаци Улыбаюсь ) есть, но работают по-другому.


Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 14-03-2006 14:59 » 

Ссылки (pointer и reference в Java - синонимы, см. указатель к спецификаци Улыбаюсь ) есть,
камень с души Отлично
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines