Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск в ArrayList по полю класса. / 8 сообщений из 8, страница 1 из 1
14.06.2017, 16:59
    #39471647
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в ArrayList по полю класса.
Всем доброго времени суток.

Подскажите, пожалуйста, как сделать быстрый поиск (без перебора всех элементов ArrayList), но поиск должен быть по строковому значению поля. В ArrayList у меня FTPFile, а искать нужно по FTPFile.getName(). Вот так не получается:
Код: java
1.
2.
3.
4.
5.
6.
7.
    public boolean getFileExist(String fileName){
        FTPFile f = new FTPFile();
        f.setName(fileName);
        boolean result = listFTPFiles.contains(f.getName());
        
        return result;
    }


Возвращает false.

Что не так делаю?
...
Рейтинг: 0 / 0
14.06.2017, 17:09
    #39471652
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в ArrayList по полю класса.
LittleLoyaВсем доброго времени суток.

Подскажите, пожалуйста, как сделать быстрый поиск (без перебора всех элементов ArrayList), но поиск должен быть по строковому значению поля. В ArrayList у меня FTPFile, а искать нужно по FTPFile.getName(). Вот так не получается:
Код: java
1.
2.
3.
4.
5.
6.
7.
    public boolean getFileExist(String fileName){
        FTPFile f = new FTPFile();
        f.setName(fileName);
        boolean result = listFTPFiles.contains(f.getName());
        
        return result;
    }


Возвращает false.

Что не так делаю?
У вас в listFTPFiles что? Файлы или их имена?
...
Рейтинг: 0 / 0
14.06.2017, 17:12
    #39471654
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в ArrayList по полю класса.
Вот набор рецептов для вопрос про поиск в списке по полю.
https://stackoverflow.com/questions/18852059/java-list-containsobject-with-field-value-equal-to-x

"Быстрый поиск (без перебора всех элементов ArrayList)" - это другая тема. Единственный вариант для структуры типа список это бинарный поиск в упорядоченном массиве. То есть у вас все файлы должны быть отсортированы по имени.
...
Рейтинг: 0 / 0
14.06.2017, 17:49
    #39471678
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в ArrayList по полю класса.
SQL2008,

файлы (тип FTPFile), получаю так:
Код: java
1.
2.
listFTPFiles = new ArrayList<FTPFile>();
Collections.addAll(listFTPFiles, ftpClient.listFiles(catalog, filter));


но сравнивать нужно по имени.


Blazkowicz,

спасибо большое! Получилось так:
Код: java
1.
boolean result = listFTPFiles.stream().filter(FTPFile -> FTPFile.getName().equals(fileName)).findFirst().isPresent();
...
Рейтинг: 0 / 0
15.06.2017, 08:35
    #39471887
13-й Пилигрим
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в ArrayList по полю класса.
LittleLoyaПолучилось так:
Код: java
1.
boolean result = listFTPFiles.stream().filter(FTPFile -> FTPFile.getName().equals(fileName)).findFirst().isPresent();


А с чего вы взяли, что такое решение удовлетворяет условию без перебора всех элементов ArrayList ?
...
Рейтинг: 0 / 0
16.06.2017, 00:58
    #39472740
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в ArrayList по полю класса.
Treeset жеж с компаратором по файлнэйму.
...
Рейтинг: 0 / 0
22.06.2017, 17:47
    #39476357
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в ArrayList по полю класса.
13-й ПилигримА с чего вы взяли, что такое решение удовлетворяет условию без перебора всех элементов ArrayList ?

Не знаю, думала, что без перебора будет быстрее. Сейчас попробовала два варианта, тот, что выше, и обход всех элементов списка. Замеры System.nanoTime() дают такие цифры:

Time execute stream.filter = 1982537841

Time execute cyrcle = 23015217

Это что получается, циклом перебирать быстрее что-ли?

Ещё заметила, что имена файлов уже отсортированы по алфавиту, интересно, на каком этапе происходит сортировка? Получается вот тут:
Код: java
1.
        Collections.addAll(setFTPFiles, ftpClient.listFiles(catalog, filter));


listFiles возвращает уже отсортированный список файлов?

no56892Treeset жеж с компаратором по файлнэйму.
А можно примерчик?
...
Рейтинг: 0 / 0
22.06.2017, 17:50
    #39476365
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в ArrayList по полю класса.
LittleLoyaЭто что получается, циклом перебирать быстрее что-ли?

Обычно, этим вопросом задаются во время изучения стримов. Да, они медленее в актуальных версиях Java. Их польза только в читаемости.

LittleLoyaЕщё заметила, что имена файлов уже отсортированы по алфавиту, интересно, на каком этапе происходит сортировка?

Может даже на FTP сервере они так записаны. Проверьте любым FTP клиентом.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск в ArrayList по полю класса. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]