Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Какую коллекцию использовать?
Список форумов
 ->  Коллекции (Java Collection Framework)


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Mako : 85
Новичок
Откуда: из мамы

СообщениеЯнв 07, 2012 14:19 
Ответить с цитатой
Я недавно в Джаве, и вообще с коллекциями не знаком. До сих пор пользовался лишь массивами. Однако сейчас возникла насущная необходимость в хранении данных, для которых массивы использовать неудобно. Итак, есть две группы чисел. Каждому числу из первой группы соответствует число из второй группы. Числа целые, положительные. Порядок чисел не важен, но если это улучшит быстродействие, то я их могу упорядочить по возрастанию. Допустим, в некоей фирме каждый человек имеет порядковый номер. Директор - 1, зам - 2, главбух - 3 и т.д. У каждого сотрудника есть ИНН, хранящийся как 12-значное число. Если бы надо было узнать ИНН сотрудника, то проблемы вообще не было бы - делаем массив типа long с количеством элементов, равным числу сотрудников, и вуаля! Однако задача обратная - хранить соответствие номера сотрудника каждому ИНН. Какую коллекцию использовать, объясните на примере?
_________________
Вы не поверите, но Java - самый низкоуровневый из изучаемых мною языков.
К началу Посмотреть профиль Отправить личное сообщение
OneHalf : 78
Новичок

СообщениеЯнв 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 : 82
Новичок

СообщениеЯнв 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 : 5
Новичок

СообщениеЯнв 13, 2012 20:31 
Ответить с цитатой
Подскажите, люди добрые! У меня такая проблема с TreeSet!! Я использую эту коллекцию в качества буфера до 4 элементов, периодически этот буфер освобождается(выводится в лог). Так вот при первом выводе, метод выполняется порядка 15-17 мсек, а при последующих за 1 мсек и меньше!!! Я грешу на сет. Выводил время перед вызовом метода и в самом методе-разница как раз и была 15-17 мсек! Может кто подскажет на что обратить внимание!???? ну естественно необходимо время сравнимое с 1мсек!!!
К началу Посмотреть профиль Отправить личное сообщение
rfq : 82
Новичок

СообщениеЯнв 13, 2012 21:56 
Ответить с цитатой
abix писал(а):
Так вот при первом выводе, метод выполняется порядка 15-17 мсек, а при последующих за 1 мсек и меньше!!!

Ну a метод-то какой?
К началу Посмотреть профиль Отправить личное сообщение
abix : 5
Новичок

СообщениеЯнв 13, 2012 23:11 
Ответить с цитатой
rfq писал(а):
abix писал(а):
Так вот при первом выводе, метод выполняется порядка 15-17 мсек, а при последующих за 1 мсек и меньше!!!

Ну a метод-то какой?
Запись в текстовый файл некоторых полей объектов этого сета. Но это не суть важно, тк поток попадает в этот метод с задержкой. Может идет какая то работа с памятью? Хотя почему именно сейчас? ведь сет уже проинициализироавн!?
К началу Посмотреть профиль Отправить личное сообщение
abix : 5
Новичок

СообщениеЯнв 15, 2012 14:56 
Ответить с цитатой
Сейчас опять вернулся к этому сету! Похоже, что дело в сортировке! Закоментил equals в классе, к которому принадлежат элементы коллекции и проблема исчезла! Но вопрос остался прежним)
К началу Посмотреть профиль Отправить личное сообщение
abix : 5
Новичок

СообщениеФев 15, 2012 9:50 
Ответить с цитатой
abix писал(а):
Подскажите, люди добрые! У меня такая проблема с TreeSet!! Я использую эту коллекцию в качества буфера до 4 элементов, периодически этот буфер освобождается(выводится в лог). Так вот при первом выводе, метод выполняется порядка 15-17 мсек, а при последующих за 1 мсек и меньше!!! Я грешу на сет. Выводил время перед вызовом метода и в самом методе-разница как раз и была 15-17 мсек! Может кто подскажет на что обратить внимание!???? ну естественно необходимо время сравнимое с 1мсек!!!
Нашел причину, дело было не в сете!! сет работает быстро!!
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Коллекции (Java Collection Framework)


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru