powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
59 сообщений из 59, показаны все 3 страниц
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240664
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например есть большая (тысячи или даже милионы обьектов) колекция, например книг. Использование каждый раз стандартного for -- очень долго. Как это сделать с помощью более специфичесих колекций- например Sеt, Mаp, и их модификаций Sortеd Mаp? Если использовать отображения то я вижу вариант создания нескольких производных карт. Например автор-название, автор-год издания. И при поиске по ключу вывод самого ключа, и значений. И если автор введен не полностью - то уже поиск из возможных вариантов. Правильный ли это подход?
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240680
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240691
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет это первый вопрос был по субд у меня касательно такого поиска, второй - меня спрашивали о колекциях, в частности о необходимости карт отображений. Индекс, ID очевидно необходим и здесь чтобы привязать например автора к ID в виде отображения, а ID соответственно к автору, названию и т.д. Но поиск то надо по автору/названию вести -- и здесь мне непонятно роль отсортированых карт - каким образом идет ускорение поиска - за счет чего достигается например обьект отображения пушкин-35000(id)/или название книги? Если это встроеный механизм sorted map то настолько быстро это действует?
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240704
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если речь про бинарный поиск то ускорение происходит элементарно.

по отсортированному списку скажем абвгдежзийклмно ты ищешь букву Л - окей, гугл. тыкаем в центр списка и видим: буква Ж. буква Ж меньше буквы Л значит тыкаем в половину второй половины списка, а это буква К. О буква К меньше буквы Л. значит дальше бьем в эту половину половины а это буква М. м больше Л. значит идем назад и опа.. там буква Л. всё. нашли. а теперь пмсчитай количество итераций и сравни с тупой переборкой сначала (или с конца), которая по факту занимает О(н) времени. т.е. линейная. в нашем поиске вышло 4 итерации, а если бы ты крутил от начала - то было бы 12. почувствуйте разницу. мне кажется, у тебя если это был собес, то скорее всего от тебя именно и ждали ответа - бинарный поиск. который применим только к сортированным данным.

надеюсь, я понятно объяснил как он работает ))
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240732
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну принцип сортировки понятен, но как именно эти отображения использовать - это был главный вопрос (мое предположение имеет смысл?). И касательно отсортированого списка (ключей)? Если идти подряд от 1 элемента к 30500 то это тоже будет достаточно долго. У меня было предположение что в отсортированом списке есть какой то маркер к которому можно обратится и определить что автор на букву П (в даном случае) начинается с 28000 позиции списка, но это наверное неправильно. Если бинарный поиск быстрее в 3 раза -- то это ощутимо, но если мне было сказано что простой перебор очень долго то такой бинарный поиск обеспечит минимум долгий поиск. Если возможно mаp.gеt (n/2) то это обьясняет как найди середину списка, но все это упрощенная версия если взять во внимание что автора/ названия вводим целиком, или хотя бы вводим начало автора или названия.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240746
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrt,
похоже это вопросы с собеседования....
если такое задаётся - то это не то место где надо стараться закрепиться.
это задача чисто для субд.
если это проверка работать с коллекциям - то вопрос надо ставить иначе.
что так же говорит о проблемности с постановкой задач.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240748
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не знаю что от тебя конкретно хотели и какие были доп.условия. но если у тебя есть коллекция и тебе в коллекции надо что-то найти, и коллекшн отсортированный - то искать надо бинарным поиском как мне кажется. и да, он не в 3 раза быстрее, а в n/log(n) раз :) либо вариант хашмапы - там выемка по ключу вообще константная величина.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240751
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtНу принцип сортировки понятен, но как именно эти отображения использовать - это был главный вопрос (мое предположение имеет смысл?). И касательно отсортированого списка (ключей)? Если идти подряд от 1 элемента к 30500 то это тоже будет достаточно долго. У меня было предположение что в отсортированом списке есть какой то маркер к которому можно обратится и определить что автор на букву П (в даном случае) начинается с 28000 позиции списка, но это наверное неправильно. Если бинарный поиск быстрее в 3 раза -- то это ощутимо, но если мне было сказано что простой перебор очень долго то такой бинарный поиск обеспечит минимум долгий поиск. Если возможно mаp.gеt (n/2) то это обьясняет как найди середину списка, но все это упрощенная версия если взять во внимание что автора/ названия вводим целиком, или хотя бы вводим начало автора или названия.
кстати по мапам - далеко не все хранят порядок , т.е. там нет понятия "середина". порядок только (что мне в голову прилетает) у линкедхашмап и тримап т.к. она вообще сортированная. и если у тебя ключ пушкин а буквы только пушк то как вариант - вытащить вначале ключи в коллекцию, а там по ней уже бинаркой пройтись. найти ключ и из ключа выдрать значение на скорости О(1).
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240754
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяarrt,
похоже это вопросы с собеседования....
если такое задаётся - то это не то место где надо стараться закрепиться.
это задача чисто для субд.
если это проверка работать с коллекциям - то вопрос надо ставить иначе.
что так же говорит о проблемности с постановкой задач.
Я тоже как то приводил пример "а как сделать то то и то то в коллекции на 20.000.000 записей". и на ответ если у тебя появилась такая задача - то ты явно что-то не так делаешь, на меня напали с криками "и такое бывает"
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240756
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас создал хашмап из 2х миллионов карт, стринг стринг. скорость вытаскивания по ключу - 0 (что и следовало из О(1) собссно). скорость добавления 700миллисекунд. долго да? )) а у тебя задача 30500 ???
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240761
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вопрос касается субд и колекций значит его можно реализовать и через колекции. Вопрос как? Ну если мое предположение неправильно то как можно иначе? Моя идея такая: списку книг с полями автор, название, год выпуска назначается и четвертое поле id. Потом на основание этой колекции: делается три карты отображение Sortedmap -- автор-id, название-id.. Если соответствие нашло выводим свойства обьекта через list.gеt(id).author и т.д.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240762
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtЕсли вопрос касается субд и колекций значит его можно реализовать и через колекции. Вопрос как? Ну если мое предположение неправильно то как можно иначе? Моя идея такая: списку книг с полями автор, название, год выпуска назначается и четвертое поле id. Потом на основание этой колекции: делается три карты отображение Sortedmap -- автор-id, название-id.. Если соответствие нашло выводим свойства обьекта через list.gеt(id).author и т.д.
30500 записей в листе - это ничто. мне кажется, там вообще соображать смысла особо нет. хочешь - переборкой тупой найди ) если в контексте дб - то выдрать два поля автор-название. и по ним гулять. Ну реально, это ниачом. Сотые доли секунды.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240805
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой подход имеет право на жизнь? 30500 - это просто я для примера привел - вопрос мне задавали на случай сотни тысяч или даже милионов. И не верю что вопрос был просто так что бы ввести в заблуждение и сказать "я не знаю". Иной вопрос был типичный из джава интервью квесшнс.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240841
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 миллиона записей за 0.7 сек добавление и выборка за даже меньшее время - это медленно или как? это в десять раз больше, чем 200 тысяч. а "миллионы" записей боюсь, аутофмемори ты словишь быстрее, чем у тебя в проц упрется. :)

мне интересно, а что будет если его спросить "а вы сами то пробовали делать выборку в коллекции на 30500 записей или так на хабре вопросов надрали?".

твой подход копирует (судя по тому что я понял) такую штуку, которая называется "ассоциативный массив", который изобрели еще в 1956м году и который в яве называется хэшмап :) понимаешь, суть в том, что они тебя заставляют придумывать велосипед. который мало того что есть, так он еще и не нужен.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240845
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спросили, а вопрос для меня остался. Хешмап или сортедмап - но одним таким отображением не обойдешся. А вот если взять их по количеству полей обьекта - может подойти. Сперва предполагал что это тривиальный вопрос, вопрос из практики. Если таким способом можно хоть в рады ускорить поиск после построения трех карт отображений - наверное это подходящий вариант. Но соответствует ли мой подход то что меня спрашивали не знаю, ибо сперва предполагал что скорость поиска будет так в 10 раз выше.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240862
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
раз в 10 выше чем что? вытаскивать по ключу - мгновенно (ну почти) независимо от размера карты. по факту искать (как я понял) тебе надо по автору по маске. ОУКЕЙ. итерируй сет ключей (если автор = ключ). 35000 ключей стринговых - это ничто. нашел ключ - дергаешь по ключу произведения.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39240893
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrt, эта тема (ее теоретическая) часть давно изучена в оптимизации SQL запросов.

В ответ на DML оператор

Код: sql
1.
delete from books where ......



SQL-оптимизатор строит план исполнения запроса который базируется форме предиката
WHERE и на статистических показателях самих данных.

Твой вопрос in general, вобщем не имеет правильного решения до тех пор пока не будем
знать все условия.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39241606
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде задание простое. Альтернатива использованию бд. Надо намного быстрее, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for. Какие еще дополнительные условия надо?
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39241613
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtВроде задание простое.
Смотря для кого.

arrtАльтернатива использованию бд.
БД сейчас на много большее понятие чем RDBMS.

arrtНадо намного быстрее
Быстрее чем проиндексированная in-memory database у тебя вряд ли получится.

arrt, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for.

Почему с помощью map? Под циклом for понимается ключевое слово в Java или итеративный процесс вообще?

arrtКакие еще дополнительные условия надо?
Вы ставите задачу и спрашиваете какие "надо условия"? Условия чего? Задачи?

Я знаю только два решения.
1) Построение индекса. Это такая коллекция, которая на много меньше нашей основной коллекции и хранит частичную информацию о том где что-то искать в нашей коллекции. Индексы бывают разными. HashMap и любое дерево можно использовать как пример индекса.
2) Многопоточный и многопроцессорный поиск aka Map\Reduce. Суть в том что коллекция разделяется на части и каждую часть прочесывает отдельный процесс. Сейчас поднять комп в облаке стоит копейки, поэтому для единоразовых акций это отличное решение. Правда, это в некотором роде вышеупомянутый for.

Эти двое, обычно, комбинируются. Так как производительность с индексом увеличивается очень сильно. А MapReduce позволяет выжать из железа максимум.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39241672
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtВроде задание простое. Альтернатива использованию бд. Надо намного быстрее, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for. Какие еще дополнительные условия надо?
Быстрее всего - использовать различные ленивые оптимизации. Например вместо удаления
книг из коллекций - создать новую коллекцию и перенести туда те которые надо оставить.
Это в том случае когда мы чистим 99% всего.

Чудно ? Правда? Но работает.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39241775
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtНапример есть большая (тысячи или даже милионы обьектов) колекция, например книг. Использование каждый раз стандартного for -- очень долго. Как это сделать с помощью более специфичесих колекций- например Sеt, Mаp, и их модификаций Sortеd Mаp? Если использовать отображения то я вижу вариант создания нескольких производных карт. Например автор-название, автор-год издания. И при поиске по ключу вывод самого ключа, и значений. И если автор введен не полностью - то уже поиск из возможных вариантов. Правильный ли это подход?


а Stream из Java 8 смотрели ?
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39241777
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242028
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtВроде задание простое. Альтернатива использованию бд. Надо намного быстрее, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for. Какие еще дополнительные условия надо?
У тебя есть тестовый набор данных? Хотя-бы строк несколько тыщ? Книга-название-автор-год издания e.t.c.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242330
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz2) Многопоточный и многопроцессорный поиск aka Map\Reduce. Суть в том что коллекция разделяется на части и каждую часть прочесывает отдельный процесс. Сейчас поднять комп в облаке стоит копейки, поэтому для единоразовых акций это отличное решение. Правда, это в некотором роде вышеупомянутый for.

С каких пор Map/Reduce стал алгоритмом поиска? Скорее это агрегация данных.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242344
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettС каких пор Map/Reduce стал алгоритмом поиска? Скорее это агрегация данных.
Во-первых, слово "алгоритм", вроде, до вас тут никто не упоминал.
Во-вторых Map/Reduce это способ распределения задач для обработки большого набора данных. Решать этим способом можно разные задачи, а не только считать агрегаты.
В-третих, обратимся, например, к википедии.
https://en.wikipedia.org/wiki/MapReduce MapReduce is useful in a wide range of applications, including distributed pattern-based searching , distributed sorting, web link-graph reversal, Singular Value Decomposition,[16] web access log stats, inverted index construction, document clustering, machine learning,[17] and statistical machine translation.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242413
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettС каких пор Map/Reduce стал алгоритмом поиска? Скорее это агрегация данных.
Он в стеке технологий стоит на шаг выше. А что вы положите в Reduce - подсчёт или поиск
это уже особенности имплементации редюсера. Главное - интерфейс соблюдается и контракт весьма
либерален.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242424
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВо-первых, слово "алгоритм", вроде, до вас тут никто не упоминал.
Во-вторых Map/Reduce это способ распределения задач для обработки большого набора данных. Решать этим способом можно разные задачи, а не только считать агрегаты.
В-третих, обратимся, например, к википедии.

Я исхожу из того, что вопрос был задан:

"Как в большой колекции обьектов найти обьект без прямого применения цыкла for?",
что, если не "алгоритм" тут можно применить?

Вы зачем-то ссылаетесь на какую-то парадигму, но она опять же требует реализации алгоритма, который в ее случае будет еще сложнее, учитывая особенности этой модели.
Так зачем вообще предлагать эти решения, когда явно автор не это спрашивает. Просто покидаться умными словами?
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242430
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОн в стеке технологий стоит на шаг выше. А что вы положите в Reduce - подсчёт или поиск
В случае Reduce поиск будет сводиться опять же к подсчету. Разве нет?
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242440
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java Stream API не предлагали ?
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242445
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettЯ исхожу из того, что вопрос был задан:
"Как в большой колекции обьектов найти обьект без прямого применения цыкла for?",
что, если не "алгоритм" тут можно применить?
Если бы автор хотел "алгоритм", то так бы и написал. Автор сам не знает чего хочет, поэтому спрашивает как оно вообще бывает помимо полного перебора. На этот вопрос я подробно и ответил - два общих подхода, индексирование и распараллеливание.
Алгоритмы это частные решения. Автор про них не спрашивал. Если ты знаешь конкретные, "алгоритмы", то ответь автору. Меня ты для чего комментируешь? То что ты не знал про использование MapReduce для поиска, ещё не значит что ты можешь решать за автора темы что ему интересно, а что нет. ОК?

HettВы зачем-то ссылаетесь на какую-то парадигму,
Затем что она часто используется для поиска во многих NoSQL решениях. Тоже не знал?

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

HettТак зачем вообще предлагать эти решения, когда явно автор не это спрашивает.
Давай, объясни нам что автор спрашивает.

HettПросто покидаться умными словами?
Железный аргумент от человека, который тут ещё ни одного предложения по теме вопроса не написал, зато уже пару раз обосрался с по вопросу распределенных вычислений.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242449
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanJava Stream API не предлагали ?
Предлагали: 19209920
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242456
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боюсь что Stream API породит еще больше вопросов. Чувак по сути вас просит подсказать
как проиндексировать его данные для поиска. И ему нужен алгоритм и структура данных.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242475
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczUsmanJava Stream API не предлагали ?
Предлагали: 19209920 ок, ну, тогда остается
Код: java
1.
while() { }

и
Код: java
1.
do { } while()
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242498
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю ему нужно нечто вроде.

Код: java
1.
2.
3.
4.
5.
Map<FuckenSearchKeys,FuckenDocument> map = new HashMap<>();
... add index

... lookup
FuckenDocument = map.get(fuckenSearchKeys);


(но здесь нужно вернуть не один док а сет документов)
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242728
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonБоюсь что Stream API породит еще больше вопросов. Чувак по сути вас просит подсказать
как проиндексировать его данные для поиска. И ему нужен алгоритм и структура данных.

Может там за кадром мощная оптимизация?
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242754
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NebomaytonБоюсь что Stream API породит еще больше вопросов. Чувак по сути вас просит подсказать
как проиндексировать его данные для поиска. И ему нужен алгоритм и структура данных.

Может там за кадром мощная оптимизация?
Это что разговор инженеров? Давайте бенчмарк. Только перед тем как его начинать
имеет смысл оговорить критерии сравнения.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242925
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз уж на досугах изучаю этот прекрасный ЯП, то вот моя балалайка:

Код: 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.
import java.util.*;

public class Main {

    public static void main(String[] args) {

        class IndexedCollection<K, V> extends HashMap<Integer, HashMap<K, V>> {
            public HashMap<V, HashMap<K, ArrayList<Integer>>> indexes = new HashMap<>();
            private int autoIncrementId = 0;

            private int getNextId() {
                return autoIncrementId++;
            }

            public HashMap<K, V> put(HashMap<K, V> e) {
                int id = getNextId();
                for (Map.Entry<K, V> entry : e.entrySet()) {
                    HashMap<K, ArrayList<Integer>> values = indexes.get(entry.getValue());
                    if (values == null) {
                        values = new HashMap<>();
                        indexes.put(entry.getValue(), values);
                    }
                    ArrayList<Integer> ids = values.get(entry.getKey());
                    if (ids == null) {
                        ids = new ArrayList<>();
                        values.put(entry.getKey(), ids);
                    }
                    ids.add(id);
                }
                return super.put(id, e);
            }

            public HashMap<K, V> get(int index) {
                return super.get(index);
            }

            public HashSet<Integer> find(HashMap<K, V> e) {
                HashSet<Integer> result = new HashSet<>();
                for (Map.Entry<K, V> entry : e.entrySet()) {
                    HashMap<K, ArrayList<Integer>> values = indexes.get(entry.getValue());
                    if (values != null) {
                        ArrayList<Integer> ids = values.get(entry.getKey());
                        if (ids != null) {
                            if (result.isEmpty()) {
                                result.addAll(ids);
                            } else {
                                result.retainAll(result);
                            }
                        } else {
                            return new HashSet<>();
                        }
                    } else {
                        return new HashSet<>();
                    }
                }
                return result;
            }
        }

        // test
        IndexedCollection<String, String> collection = new IndexedCollection<>();

        System.out.println("Generating data...");
        Random rn = new Random();
//        for (int i = 0; i < 1000000; i++) {
//            HashMap<String, String> e = new HashMap<>();
//            e.put("field_1", Integer.toString(rn.nextInt(10000)));
//            e.put("field_2", Integer.toString(rn.nextInt(10000)));
//            e.put("field_3", Integer.toString(rn.nextInt(10000)));
//            collection.put(e);
//        }

        {
            HashMap<String, String> e = new HashMap<>();
            e.put("field_1", "value_1");
            e.put("field_2", "value_2");
            e.put("field_3", "value_3");
            collection.put(e);
        }

        HashMap<String, String> e = new HashMap<>();
        e.put("field_1", "value_1");
        e.put("field_2", "value_2");

        HashSet<Integer> result = collection.find(e);
        System.out.println("Found ids: " + result.toString());

        System.out.println("Found data");

        for (int id : result) {
            System.out.println(collection.get(id));
        }

    }
}



сильно не пинайте
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39242937
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettРаз уж на досугах изучаю этот прекрасный ЯП, то вот моя балалайка:
Стоит обратить внимание на Java 8 и Guava, чтобы не изобретать MultiMap и не писать колбасу из if-ов. К тому же это поможет расширить сознание под функциональное программирование.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39243004
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще через страниц ~20 окажется что у автора постановка годная для использования Apache Lucene
и все мапы идут лесом.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39243007
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕще через страниц ~20 окажется что у автора постановка годная для использования Apache Lucene
и все мапы идут лесом.
Автору темы, как обычно, пофигу. Вбросил и пропал. Дальше сами.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39243030
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrt,

Как вариант, в качестве ключей можно использовать Enum ( Перечисления ).
А вместе с ними EnumMap/EnumSet .
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39243035
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanarrt,

Как вариант, в качестве ключей можно использовать Enum ( Перечисления ).
А вместе с ними EnumMap/EnumSet .
Set - Множество

Операции над множествами:
Код: java
1.
2.
3.
4.
s1.containsAll(s2) //— TRUE - если s1 содержит s2 (является подмножеством)
s1.addAll(s2)      //— Объединение
s1.retainAll(s2)   //— Пересечение
s1.removeAll(s2)   //— Разность
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39243053
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он пишет
авторНапример автор-название, автор-год издания. И при поиске по ключу вывод самого ключа, и значений. И если автор введен не полностью - то уже поиск из возможных вариантов.
Попробуйте натянуть работу с множествами на эту постановку.
И потом он завтра захочет искать издательство-год-издания, автор-соавтор, ISBN....
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39243070
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ потом он завтра захочет искать издательство-год-издания, автор-соавтор, ISBN....через пару страниц (:
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39248523
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Был вопрос но он не выяснен. Мой подход имеет смысл? И насколько он эфективен. Но там пара k-v расматривается в контексте: автор-id, названия-id... и т.д. Ведь надо какой то уникальный идентификатор же. Ведь автор-названия может иметь несколько вариантов, и вариантов комбинаций больше, а так только n мапов, которое соответсвует количеству полей колекции, и делает такой подход более схожым с бд... И таким образом нашел ID, и сразу и при ее нахождение перешел к обьекту колекции посредством gеt(id)
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39248527
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtБыл вопрос но он не выяснен. Мой подход имеет смысл? И насколько он эфективен. Но там пара k-v расматривается в контексте: автор-id, названия-id... и т.д. Ведь надо какой то уникальный идентификатор же. Ведь автор-названия может иметь несколько вариантов, и вариантов комбинаций больше, а так только n мапов, которое соответсвует количеству полей колекции, и делает такой подход более схожым с бд... И таким образом нашел ID, и сразу и при ее нахождение перешел к обьекту колекции посредством gеt(id)
Ничего не понял.
I.
1. В случае работы в оперативной памяти/Java ID нафиг не нужно, т.к. указатель на объект и так замечательно роль ID выполняет
2. Не хватает ID, добавьте его, в чем проблема?

arrt\Если использовать отображения то я вижу вариант создания нескольких производных карт. Например автор-название, автор-год издания. И при поиске по ключу вывод самого ключа, и значений......Правильный ли это подход?
II.
Какое нафиг автор --> название, автор --> год издание? Ключевое поле --> объект. А в объекте уже все данные и хранятся

p.s. или я не въехал в тему
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39248998
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, так поле id уже добавили. Как тогда различать обьекты. Как их определить то. This один. Да и если карта состоит из полей - это компоненты одного уровня, а как тогда поле-обьект - автор->this?? author-list.get(id).. Id то ведь уникальное, другие поля хоть не примитивы, а стринги, но обьекты ведь..
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249046
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtLeonid Kudryavtsev, так поле id уже добавили. Как тогда различать обьекты. Как их определить то. This один. Да и если карта состоит из полей - это компоненты одного уровня, а как тогда поле-обьект - автор->this?? author-list.get(id).. Id то ведь уникальное, другие поля хоть не примитивы, а стринги, но обьекты ведь..
Возможно я плохо соображаю. Но не только смысл текста от меня ускользает, но даже отдельных слов я не знаю )))
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249125
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtLeonid Kudryavtsev, так поле id уже добавили. Как тогда различать обьекты. Как их определить то. This один. Да и если карта состоит из полей - это компоненты одного уровня, а как тогда поле-обьект - автор->this?? author-list.get(id).. Id то ведь уникальное, другие поля хоть не примитивы, а стринги, но обьекты ведь..
Вот тебе серебрянная пуля.

https://lucene.apache.org/core/index.html

Иди читай. А потом приходи и говори почему не подходит.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249243
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати.. насчет скорострельности.. кто то говорил что между явой и бд - бд производительнее. типа лучше объем данных грузануть в ИМДБ (не путать с рейтингом кинофильмов), и там проделать операции с объемом данных, типа сортировки выборки и т.п.

а теперь вопрос:

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

исходя из этого КАК Можно утверждать, что ява делает эти операции хуже, чем классическая полновесная бд?

да, я речь не веду о выборке и сортировке 5 миллиардов записей, но того, что можно взять в память и там этим манипулировать.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249255
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Земля тряслась — как наши груди,
Смешались в кучу кони, люди.... ( C ) Лермонтов М. Ю

andreykaTкстати.. насчет скорострельности..
А как насчет Assembler'а?

H2 отстой! Лучше грузаните данные в assembler. Лучше всего в регистр AX - он самый быстрый из всех!
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249260
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЗемля тряслась — как наши груди,
Смешались в кучу кони, люди.... ( C ) Лермонтов М. Ю

andreykaTкстати.. насчет скорострельности..
А как насчет Assembler'а?

H2 отстой! Лучше грузаните данные в assembler. Лучше всего в регистр AX - он самый быстрый из всех!
Ну вы же понимаете, что в данном случае трудозатраты будут мало соизмеримы с выхлопом А что с н2 не так - полная поддержка скля, для тестов супер, для небольших приложений еще круче, чем супер.

ну а всё же вопрос не в этом. просто я не понимаю утверждения что имдб для операций с объемами быстрее явы даже в том случае, что эта имдб сама написана на яве ))) это, простите, КАК?
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249294
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процитируйте утверждение, которое Вы не понимаете, еще раз ? Желательно добуквенно и со ссылкой на источник, что бы не выдергивать из контекста.

Java - язык программирования общего назначения, не СУБД
СУБД - система управления базами данных, а отнюдь не язык программирования
БД - обычно хранят большое кол-во информации, которое, не факт, что поместиться в ОП
In memory DB - специальный случай БД относительно небольшого объема, но обычно более производительные

и так далее. Мухи это одно, котлеты другое. Сравнивать мух с котлетами - конечно можно, но бессмысленно.

andreykaTКАК?
Как как, кверху ... ( C ) народная мудрость.

andreykaTНу вы же понимаете, что в данном случае трудозатраты будут мало соизмеримы с выхлопом
Совершенно соизмеримы

mov ax, данные - положить данные в регистровую СУБД
mov куда_нибудь, ax - извлечь данные

Трудозатраты стремятся к 0, выхлоп тоже стремится к 0 ))). Вполне соизмеримо.

Зато гарантированно самый быстрый способ. Можно даже целые 16 бит сохранить!!! Никакая БД данных с этим способом и близко не стоит. 1 транзакция - 1 так процессора и даже быстрее !!!! Т.к. данные инструкции вообще zero latency.

)))
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249299
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryav

спасибо, посмеялся.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249340
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTфакт, что есть такая штука, как Н2,
факт, что она очень быстрая. она быстрее и мускула и постгреса оракла и т.п. по крайней мере в ряде операций. сами н2шники тесты не озвучивают но, их можно найти да и сам я в этом убеждался.
и теперь самое интересное: н2 это не какой то там мегасервер - это ява-приложение. или даже ява-библиотека, интегрируемая в ява приложение.
Она скорее не быстрая а удобная. Т.к. работает в одном адресном пространстве с твоим приложением.
Рискну предположить что тесты которые ты смотрел были ПРО ЭТО. Как следствие накладные расходы
на callback 1-й функции у нее будут почти нулевые т.к. нет Network/IPC взаимодействия.

По части производительности. Я как-то грузил в H2 данные по географии - у нее были трудности на нескольких
миллионах с коммитом. Правда это было в 2009 году. Возможно щас стало получше.

По поводу самого-самого быстрого в мире.

Есть сайтик с тестами http://www.tpc.org/default.asp где устраивают соревнования.
Обычно это MSSQL/Oracle/DB2 и еще несколько систем название которых мне ни о чем не говорит.

Вобщем почитай.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249365
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
из реальной практики
делал в mssql поиск where поле like '%ghg%' and поле like '%hgh%',
10 000 000, записей время поиска при условии, что искомого нет, т.е. просмотр всей таблицы
4сек
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249374
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OFFTOPIC ON

maytonТ.к. работает в одном адресном пространстве с твоим приложением.
Рискну предположить что тесты которые ты смотрел были ПРО ЭТО. Как следствие накладные расходы
на callback 1-й функции у нее будут почти нулевые т.к. нет Network/IPC взаимодействия.

Сейчас использую SQL Lite 3 (сейчас табличка до 40 мил.строк, вообще может быть 100-200 лямов)

Сравнивал с PostgreSQL, разница получилась около в 7-10 раз более быстрые атомарные insert/select.

maytonПо части производительности. Я как-то грузил в H2 данные по географии - у нее были трудности на нескольких
миллионах с коммитом. Правда это было в 2009 году. Возможно щас стало получше.

На SQL Lite комичу примерно по 1 ляму за раз, при объеме таблички > 10-20 мил. строк операция insert становится заметно медленнее ((( Думаю, что все дело в размере кеша. Но пока не разбирался.

Скорость вставки для меня приемлемая, но хочется значительно быстрее ((( Возможно, заменю на что нибудь другое (пока нормальной key-value базы не нашел)

p.s. нормальность:
1. наличие бинарного (скопилированно) кода под Linux / Windows, интерфейс для Java
2. относительно приличный сайт/документация. Т.к. документация типа http://www.mapdb.org/ где вообще ничего не понятно, как оно внутри работает и чем один класс от другого отличается - лично мне доверия не внушает (((
3. Ясная free лицензия

Google Level DB и SQL Lite 4 из-за п.1. пошло лесом. Google Level DB Windows указывает в качестве supported платформы, но бинарников под Windows на оф. сайте не увидел. Существующие инструкции сборки под Windows с описаниями - "мы не поняли, чем заменять эти функции, выкинули нафиг, но вроде пока работает" ))) доверия не вселяют.
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249383
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
большие вставки делают обычно средствами самой скбд прямо из файла csv
...
Рейтинг: 0 / 0
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
    #39249421
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, Wow-wow! .... меня совершенно не удивляют эти цифры.
Более того я готов кивать, когда мне говорят - уууу.... а уменя сто тыщ
мильонов апдейтов в сек. пролетело. Я киваю головой и верю. И такое бывает.

И вобщем предлагаю вернуться к афтору. Иначе мы скатимся в обсуждение Стебельков :)
...
Рейтинг: 0 / 0
59 сообщений из 59, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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