|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
Mako : 85 Новичок Откуда: из мамы
|
Янв 07, 2012 14:19 |
|
|
Я недавно в Джаве, и вообще с коллекциями не знаком. До сих пор пользовался лишь массивами. Однако сейчас возникла насущная необходимость в хранении данных, для которых массивы использовать неудобно. Итак, есть две группы чисел. Каждому числу из первой группы соответствует число из второй группы. Числа целые, положительные. Порядок чисел не важен, но если это улучшит быстродействие, то я их могу упорядочить по возрастанию. Допустим, в некоей фирме каждый человек имеет порядковый номер. Директор - 1, зам - 2, главбух - 3 и т.д. У каждого сотрудника есть ИНН, хранящийся как 12-значное число. Если бы надо было узнать ИНН сотрудника, то проблемы вообще не было бы - делаем массив типа long с количеством элементов, равным числу сотрудников, и вуаля! Однако задача обратная - хранить соответствие номера сотрудника каждому ИНН. Какую коллекцию использовать, объясните на примере? _________________ Вы не поверите, но Java - самый низкоуровневый из изучаемых мною языков. |
|
|
|
 |
OneHalf : 103 Новичок
|
Янв 07, 2012 16:19 |
|
|
Кратко:
Collection - Набор элементов. Нельзя обратиться к конкретному элементу по индексу. Зато можно пройтись по всем элементам циклом (Порядок при этом не гарантируется). Можно добавлять, удалять элементы, проверять наличие элемента в коллекции
Этот интерфейс - родитель Set и List
Set - набор неповторяющихся элементов. Методы у Set такие же как у Collection. При добавлении элемента, уже присутствующего в списке, ничего не меняется
List - аналог массивов. Можно получать элементы по индексу, добавлять несколько одинаковых элементов и т.д. Отличается от массивов тем, что сам расширяется при необходимости.
Map - соответствие элементов. Например, объявляем соответствие ИНН и номера:
| Код: |
Map<String, Long> map = new HashMap<String, Long>();
|
Вставка элемента:
| Код: |
map.put("29458927589375973", 1L);
|
Получение элемента:
| Код: |
Long id = map.get("29458927589375973");
|
|
|
|
|
 |
Mako : 85 Новичок Откуда: из мамы
|
Янв 07, 2012 18:44 |
|
|
Да, судя по всему, мне нужен HashMap. Я правильно понимаю, что время поиска элемента по ключу непредсказуемо и в худшем случае равно времени перебора всех элементов? Существуют ли какие-то способы ускорить процесс? Например, воспользовавшись тем обстоятельством, что я могу упорядочить ИНН строго по возрастанию.
Изначально я хотел вообще всё сделать через два массива: "индекс - должность" и "индекс - ИНН". И каждый раз искать соответствие "ИНН - должность" бинарным поиском. Очевидно, затраченное время будет пропорционально не количеству элементов, а его логарифму по основанию 2. Однако HashMap - гораздо более наглядное решение.
Вот как примерно это выглядит у меня сейчас. Есть массив ИНН:
ИНН[0] = 777777777777
ИНН[1] = 888888888888
ИНН[2] = 999999999999
И массив должностей:
Должность[0] = "Директор"
Должность[1] = "Бухгалтер"
Должность[2] = "Дворник"
Нам надо определить, кому принадлежит ИНН = 888888888888. Ищем это значение в массиве ИНН, находим по индексу 1. В массиве Должность с тем же индексом прописана должность "Бухталтер". Ура! _________________ Вы не поверите, но Java - самый низкоуровневый из изучаемых мною языков. |
|
|
|
 |
rfq : 211 Новичок
|
Янв 07, 2012 19:36 |
|
|
| Mako писал(а): |
| Я правильно понимаю, что время поиска элемента по ключу непредсказуемо и в худшем случае равно времени перебора всех элементов? |
Ну это вам вряд ли грозит - номера ИНН должны хорошо распределяться хэш-функцией. Если в конце концов это случится, замените HasMap на ТрееMap - среднее время больше, но максимальное гарантировано O(log n).
Вот время на загрузку-выгрузку данных и построение коллекций может оказаться значительным. Поэтому логично сразу воспользоваться какой-либо системой управления базами данных - реляционной или объектно-ориентированной. |
|
|
|
 |
Mako : 85 Новичок Откуда: из мамы
|
Янв 08, 2012 9:06 |
|
|
[quote="rfq"]
| Mako писал(а): |
| Я правильно понимаю, что время поиска элемента по ключу непредсказуемо и в худшем случае равно времени перебора всех элементов? |
| Цитата: |
| Ну это вам вряд ли грозит - номера ИНН должны хорошо распределяться хэш-функцией. Если в конце концов это случится, замените HasMap на ТрееMap - среднее время больше, но максимальное гарантировано O(log n). |
Нет, мне важнее уменьшить среднее время извлечения элемента, потому что запросов будет очень много. Так что однозначно HashMap.
| Цитата: |
| Вот время на загрузку-выгрузку данных и построение коллекций может оказаться значительным. Поэтому логично сразу воспользоваться какой-либо системой управления базами данных - реляционной или объектно-ориентированной. |
В моём случае HashMap будет строиться один раз - при запуске проги. _________________ Вы не поверите, но Java - самый низкоуровневый из изучаемых мною языков. |
|
|
|
 |
abix : 12 Новичок
|
Янв 13, 2012 20:31 |
|
|
| Подскажите, люди добрые! У меня такая проблема с TreeSet!! Я использую эту коллекцию в качества буфера до 4 элементов, периодически этот буфер освобождается(выводится в лог). Так вот при первом выводе, метод выполняется порядка 15-17 мсек, а при последующих за 1 мсек и меньше!!! Я грешу на сет. Выводил время перед вызовом метода и в самом методе-разница как раз и была 15-17 мсек! Может кто подскажет на что обратить внимание!???? ну естественно необходимо время сравнимое с 1мсек!!! |
|
|
|
 |
rfq : 211 Новичок
|
Янв 13, 2012 21:56 |
|
|
| abix писал(а): |
| Так вот при первом выводе, метод выполняется порядка 15-17 мсек, а при последующих за 1 мсек и меньше!!! |
Ну a метод-то какой? |
|
|
|
 |
abix : 12 Новичок
|
Янв 13, 2012 23:11 |
|
|
| rfq писал(а): |
| abix писал(а): |
| Так вот при первом выводе, метод выполняется порядка 15-17 мсек, а при последующих за 1 мсек и меньше!!! |
Ну a метод-то какой? |
Запись в текстовый файл некоторых полей объектов этого сета. Но это не суть важно, тк поток попадает в этот метод с задержкой. Может идет какая то работа с памятью? Хотя почему именно сейчас? ведь сет уже проинициализироавн!? |
|
|
|
 |
abix : 12 Новичок
|
Янв 15, 2012 14:56 |
|
|
| Сейчас опять вернулся к этому сету! Похоже, что дело в сортировке! Закоментил equals в классе, к которому принадлежат элементы коллекции и проблема исчезла! Но вопрос остался прежним) |
|
|
|
 |
abix : 12 Новичок
|
Фев 15, 2012 9:50 |
|
|
| abix писал(а): |
| Подскажите, люди добрые! У меня такая проблема с TreeSet!! Я использую эту коллекцию в качества буфера до 4 элементов, периодически этот буфер освобождается(выводится в лог). Так вот при первом выводе, метод выполняется порядка 15-17 мсек, а при последующих за 1 мсек и меньше!!! Я грешу на сет. Выводил время перед вызовом метода и в самом методе-разница как раз и была 15-17 мсек! Может кто подскажет на что обратить внимание!???? ну естественно необходимо время сравнимое с 1мсек!!! |
Нашел причину, дело было не в сете!! сет работает быстро!! |
|
|
|
 |
->JunkI{y<- : 11 Новичок
|
Мар 21, 2012 20:29 |
|
|
Прошу прощения что не по теме. Сколько не читал литературы, не видел подобного использования треугольных скобок:
| Цитата: |
| Map<String, Long> map = new HashMap<String, Long>(); |
Подскажите, что обозначают типы String и Long в этом выражении. Для чего это используется?
Большое спасибо. |
|
|
|
 |
trarex : 119 Новичок Откуда: Киев
|
Мар 21, 2012 21:44 |
|
|
|
|
|
|
 |
zAlexandr : 138 Новичок
|
Мар 26, 2012 13:08 |
|
|
| ->JunkI{y<- писал(а): |
Прошу прощения что не по теме. Сколько не читал литературы, не видел подобного использования треугольных скобок:
| Цитата: |
| Map<String, Long> map = new HashMap<String, Long>(); |
Подскажите, что обозначают типы String и Long в этом выражении. Для чего это используется?
Большое спасибо. |
HashMap может содержать в себе что угодно.
Выражение
| Код: |
| Map<String, Long> map = new HashMap<String, Long>() |
будет означать лишь, что по ключу String вы сможете получить из хэшмапа Long.
Только вот я не понял зачем вам такие сложности... Можно создать класс, описывающий сотрудника (назовем его Person, например) - его имя, фамилию, отчество, должность, ИНН, дату рождения (и т.д. и т.п.)
Все это запихнуть в хэшмэп по ключу (хоть бы даже по тому же ИНН) и дергать по этому ключу, когда надо... На выходе будет не ключ к следующему массиву, в котором найдете ключ к следующему массиву (и т.д.), а целиком нужный объект со всеми своими полями...
Извиняюсь, если я не правильно понял изначальной задачи
[/code] |
|
|
|
 |
|
|
|