Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка файлов и каталогов 
:(
    Опции темы
kren
Дата 7.10.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



Дело в том, что мне надо отоброзить каталоги и файли в таком порядке, чтобы сначала шли каталоги, а только потом файлы. Сейчас y меня они все в куче, и никак немогу придумать как осушецтвить такую сортировку. Код примерно такой:

Код


if (now_dir.isDirectory()) {
            
            String s[] = now_dir.list();
            for (int i = 0; i < s.length; i++) {
                File f = new File(now_dir, s[i]);
if (f.isDirectory()) {    
                    
                    item1 = new TableItem(table, SWT.NONE);
                    Image closed_directory = new Image(display, "zzz/closed_dir.gif");
                    item1.setImage(closed_directory);
                    item1.setText(new String[] { s[i], "Folder", "", last_modified });
} else if (f.isFile()) {
...




PM MAIL   Вверх
shimopus
Дата 7.10.2006, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 25.8.2006

Репутация: 1
Всего: 1



а где собрался отображать-то этот список? Может это у тебя будет List  объектов? Тогда можно создать свой компаратор (Comparator), который будет смотреть: если папка, то она больше любого файла, ну и другую логику в него можно запихнуть. А потом воспользоваться статическим методом Collections.sort и передать в него свою коллекцию и компаратор.
PM ICQ Skype GTalk   Вверх
y3u
Дата 7.10.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



методом sort у коллекций не эффективно пользоваться еще с четвертой джавы, если что-то надо сортировать нужно пользоваться коллекциями, заточенными под сортировку...
вот пример, который берет список файлов с диска C и сортирует сначала папки и файлы, при чем в обоих случаях по алфавиту и без учета "заглавности" буковок:

Код

public final class SortingExample {

    private SortingExample() {
    }

    public static void main(String[] args) {
        SortedSet<File> files = new TreeSet<File>(new FilesComparator());

        File[] driveCRootFiles = new File("C:\\").listFiles();
        for (int i = 0; i < driveCRootFiles.length; i++) {
            files.add(driveCRootFiles[i]);
        }
    }

    private static final class FilesComparator implements Comparator<File> {
        public int compare(File o1, File o2) {
            if (o1.isDirectory() & o2.isFile()) {
                return -1;
            }
            if (o1.isFile() & o2.isDirectory()) {
                return 1;
            }
            return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
        }
    }
}



--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
shimopus
Дата 7.10.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 25.8.2006

Репутация: 1
Всего: 1



Прошу прощения за оффтопик. Никак не могу понять смысла следующей строки: 
Код

if (o1.isDirectory() & o2.isFile()){}

PM ICQ Skype GTalk   Вверх
y3u
Дата 7.10.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



один амперсанд по синтаксису означает, что будут проверяться оба условия, а не только первое, isDirectory() - это значит, что первый из сравниваемых объектов - это папка, соответственно, второй из сравниваемых объектов isFile() - это файл... Если первый объект папка а второй объект файл, то сортируемый объект перемещаем вверх по списку, если наоборот, то вниз, а если сравниваются два однотипных объекта, то перемещаем их вверх вниз или оставляем на месте сравнивая имена файлов... 
Это все можно было почитать в джавадоках...


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
LSD
Дата 7.10.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(y3u @  7.10.2006,  12:05 Найти цитируемый пост)
методом sort у коллекций не эффективно пользоваться еще с четвертой джавы

Это еще почему?
Код
import java.util.*;

public class SortTest
{
  private static final Integer[] data = new Integer[1024 * 1024];

  public static void main(String[] args)
  {
    fillTestData();
    testSortedSet();
    testSortArray();
  }

  private static void fillTestData()
  {
    Random rnd = new Random();
    for(int i = 0; i < data.length; i++)
      data[i] = rnd.nextInt();
  }

  private static void testSortedSet()
  {
    SortedSet<Integer> set = new TreeSet<Integer>();
    long time = System.currentTimeMillis();
    for(Integer integer : data)
      set.add(integer);
    time = System.currentTimeMillis() - time;
    System.out.println("SortedSet time = " + time);
  }

  private static void testSortArray()
  {
    long time = System.currentTimeMillis();
    Arrays.sort(data);
    time = System.currentTimeMillis() - time;
    System.out.println("Array sort time = " + time);
  }
}

Цитата
SortedSet time = 7485
Array sort time = 2578

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

Цитата(y3u @  7.10.2006,  12:26 Найти цитируемый пост)
один амперсанд по синтаксису означает, что будут проверяться оба условия

А какой в этом смысл в данном случае? Методы isDirectory() и isFile() не меняют состояние объекта.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
kren
Дата 7.10.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



Спасиба за помощь. Проблему разрешил. Вот как ето сделал:

Код

...

Comparator<File> sortin = new DirComparator();
File[] gg = now_dir.listFiles();
Arrays.sort(gg, sortin);

...
class DirComparator implements Comparator<File> {
    public int compare(File a, File b) {
        if (a.isDirectory() && !b.isDirectory()) {
            return -1;

        } else if (!a.isDirectory() && b.isDirectory()) {
            return 1;

        } else {
            return a.getName().compareToIgnoreCase(b.getName());
        }
    }
}



Это сообщение отредактировал(а) kren - 7.10.2006, 16:39
PM MAIL   Вверх
y3u
Дата 7.10.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



Цитата(LSD @  7.10.2006,  15:12 Найти цитируемый пост)
Это еще почему?

это не корректный пример, в этом случае тратится время на выделение памяти в коллекции, а массив уже заполнен. Ты посчитай время с заолнением массива - коллекция порвет на тряпки, т.к. массив располагается в памяти последовательно ему надо аллочить память кусками. К тому же в коллекции у тебя происходит сортировка одного элемента сразу при добавлении, а массив целиком сортируется - на перфомансе это очень негативно скапзывается, к тому же, если я буду добавлять в коллекцию элементы в результате неких действий, а захочу видеть отсортированные данные постоянно - массив придется все время пересортировывать...


Цитата(LSD @  7.10.2006,  15:12 Найти цитируемый пост)
А какой в этом смысл в данном случае? Методы isDirectory() и isFile() не меняют состояние объекта. 

а, ну да... smile можно &&


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
LSD
Дата 7.10.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(y3u @  7.10.2006,  18:37 Найти цитируемый пост)
это не корректный пример

Это пример для той задачи что была предложена.


Цитата(y3u @  7.10.2006,  18:37 Найти цитируемый пост)
в этом случае тратится время на выделение памяти в коллекции, а массив уже заполнен. Ты посчитай время с заолнением массива - коллекция порвет на тряпки, т.к. массив располагается в памяти последовательно ему надо аллочить память кусками.

Ерунда!
1. Выделить один раз кусок на 1Мб гораздо проще чем 1024 раз по 1Кб.
2. Память SortedSet жрет нещадно.
Если модифицировать мой пример:
Код
import java.util.*;

public class SortTest
{
  private static final Integer[] data = new Integer[1024 * 1024];

  public static void main(String[] args)
  {
    fillTestData();
    testSortedSet();
    testSortArray();
  }

  private static void fillTestData()
  {
    Random rnd = new Random();
    for(int i = 0; i < data.length; i++)
      data[i] = rnd.nextInt();
  }

  private static void testSortedSet()
  {
    Runtime runtime = Runtime.getRuntime();
    doGC();
    long before = runtime.totalMemory() - runtime.freeMemory();
    SortedSet<Integer> set = new TreeSet<Integer>();

    long time = System.currentTimeMillis();
    for(int i = 0; i < data.length; i++)
      set.add(data[i]);
    time = System.currentTimeMillis() - time;
    System.out.println("SortedSet time = " + time);

    doGC();
    long after = runtime.totalMemory() - runtime.freeMemory();
    System.out.println("SortedSet uses " + (after - before) + " bytes");
  }

  private static void testSortArray()
  {
    Runtime runtime = Runtime.getRuntime();
    doGC();
    long before = runtime.totalMemory() - runtime.freeMemory();
    ArrayList<Integer> list = new ArrayList<Integer>(data.length);

    long time = System.currentTimeMillis();
    for(int i = 0; i < data.length; i++)
      list.add(data[i]);
    Collections.sort(list);
    time = System.currentTimeMillis() - time;
    System.out.println("ArrayList sort time = " + time);

    doGC();
    long after = runtime.totalMemory() - runtime.freeMemory();
    System.out.println("ArrayList uses " + (after - before) + " bytes");
  }

  private static void doGC()
  {
    System.gc();
    System.gc();
    System.gc();
    System.gc();
    System.gc();
  }
}

Цитата
SortedSet time = 7438
SortedSet uses 33550352 bytes
ArrayList sort time = 3422
ArrayList uses 4194344 bytes

ArrayList по прежнему быстрее, хотя и уже не настолько, сказывается время на заполнение массива. Но вот по памяти, ArrayList занял на пару байт больше чем 4Мб (т.е. столько сколько занимает массив 1024*1024 элементов), а вот SortedSet заняла 32Мб.

Цитата(y3u @  7.10.2006,  18:37 Найти цитируемый пост)
а захочу видеть отсортированные данные постоянно - массив придется все время пересортировывать...

Согласен. В этом случае SortedSet предпочтительней, если конечно не требуется добавлять дублирующиеся элементы.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
y3u
Дата 7.10.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



да дело не только в потребляемой памяти, это естественно, что линкованные данные в памяти жрут больше места - за удобтво надо платить. Дело в том, что память, как таковая, сейчас стоит очень дешево в плане ресурсов и финансовых и физических. Ты попробуй замерить перфоманс, сортировка в коллекции сводится к перекидыванию ссылок, а при соритровке массива присутствуют некие трудности, связанные с тем, что данные расположены в памяти строго последовательно и фрагментированно... Вот представь ситуацию, что в один и тот же момент времени начинают сортировать данные 1к пользователей. Если брать процесс добавления в коллекцию по компаратору, то перфоманс будет в разы меньше, чем полная пересортировка коллекции... Вообще это дело такое, без нормального нагрузочного теста этот спор -  просто сотрясание воздуха, я просто на основе своего опыта говорю smile Я вообще, если честно, самой эффективной коллекцией считаю ArrayList - она содержит в себе преимущества и массива и линкованых данных...

Это сообщение отредактировал(а) y3u - 7.10.2006, 18:36


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
LSD
Дата 7.10.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(y3u @  7.10.2006,  19:35 Найти цитируемый пост)
да дело не только в потребляемой памяти, это естественно, что линкованные данные в памяти жрут больше места - за удобтво надо платить.

Но в 8 раз больше! Это больше чем занимают сами данные.

Цитата(y3u @  7.10.2006,  19:35 Найти цитируемый пост)
Ты попробуй замерить перфоманс, сортировка в коллекции сводится к перекидыванию ссылок, а при соритровке массива присутствуют некие трудности, связанные с тем, что данные расположены в памяти строго последовательно и фрагментированно... Вот представь ситуацию, что в один и тот же момент времени начинают сортировать данные 1к пользователей. Если брать процесс добавления в коллекцию по компаратору, то перфоманс будет в разы меньше, чем полная пересортировка коллекции... Вообще это дело такое, без нормального нагрузочного теста этот спор -  просто сотрясание воздуха, я просто на основе своего опыта говорю  Я вообще, если честно, самой эффективной коллекцией считаю ArrayList - она содержит в себе преимущества и массива и линкованых данных...

Я думаю тебе надо почитать, что из себя представляют массивы в Java. Потому что все что ты сейчас высказал, не имеет никакого отношения к реальности smile
Массивы в Java хранят в себе только ссылки (исключение составляют массивы примитивных типов, но здесь про них никто не говорил). Так что и в случае с массивами сортируются только ссылки. Между прочим если посмотришь исходный код ArrayList, то увидишь, что по сути это обычный массив плюс парочка сервисных функций и по скорости доступа быстрее всего массив.
Опыт это конечно хорошо, но если ты не можешь предложить никакого конкретного теста, то это как ты выразился "просто сотрясание воздуха".


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
y3u
Дата 7.10.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



2 LSD
ну я же не претендую на что-то из ряда вон  smile хороший спор он всегда полезен всем и во всех отношениях! 
полез в исходнеги и в документацию...

ПыСы
уже в который раз убеждаюсь - джава и традиционные языки не всегда корелируют! В разреботчиках джабы ОЧЕНЬ серьезные дядьки с тётьками тусят...

ПыПЫСы
отдельный респектище матёрым форумчанам - дело во всех отнощениях полезное! много мнений - аргументированый выбор!

ПыПыПыСы
я настаиваю на замерах хардвар перфоманса!

Это сообщение отредактировал(а) y3u - 7.10.2006, 22:25


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
LSD
Дата 8.10.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(y3u @  7.10.2006,  23:17 Найти цитируемый пост)
ПыПыПыСы
я настаиваю на замерах хардвар перфоманса!

В чем проблема, предложи идею и код.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.