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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как наиболее эффективно присвоить элемент, LinkedHashMap по индексу? 
V
    Опции темы
Royan
Дата 25.4.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Я понимаю, что LinkedHashMap на то и хэш, чтобы обращаться к элементам по ключам, но у меня есть дополнительная задача, когда важно как можно быстрее присвоить пару ключ-значение, например на место второй пары записать другую пару ключ-значение. 
Мой грубый подоход базируется на полном поэлементном копировании всего хэша, и вставке пары в нудный момент. Понятное дело это медленный подход, а как или чем взамен LinkedHashMap вы бы могли мне посоветовать пользоваться, главное - это гарантировать, что последовательность элементов в хэше сохраняется ровно такой же какой она сформировалась вначале, когда элементы туда добавлялись.
 


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
ALKS
Дата 25.4.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Royan, постановку задачи не понял. тебе нужно максимально быстро заменить уже существующий в Маp объект? ну т.е. ключ тот же но новое значение? или тебе нужно максимально быстро добавлять новый элемент? 
PM   Вверх
Royan
Дата 25.4.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Максимально быстро менять пару (и ключ и значение), по заданному индексу. 


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
ALKS
Дата 25.4.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне кажется, тогда тебе вообще не Map надо. свою пару ключ-значение опиши каким-нить объектом, и храни такие обекты в LinkedList. 
PM   Вверх
ShamanTrirukiy
Дата 25.4.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ALKS @  25.4.2006,  17:13 Найти цитируемый пост)
Мне кажется, тогда тебе вообще не Map надо. свою пару ключ-значение опиши каким-нить объектом, и храни такие обекты в LinkedList.  

Стоит ли для хранения пар делать обертку? 
Насколько критичен доступ по ключу?
В случае с предложенным способом, так как доступ к парам нужен прямой
Цитата(Royan @  25.4.2006,  16:34 Найти цитируемый пост)
на место второй пары записать другую пару ключ-значение

то использовать надо ArrayList а не LinkedList (последователльный доступ)
 Использовать можно только хэш? 

Это сообщение отредактировал(а) ShamanTrirukiy - 25.4.2006, 17:55
PM MAIL   Вверх
ALKS
Дата 25.4.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ShamanTrirukiy @ 25.4.2006,  17:37)
Цитата(ALKS @  25.4.2006,  17:13 Найти цитируемый пост)
Мне кажется, тогда тебе вообще не Map надо. свою пару ключ-значение опиши каким-нить объектом, и храни такие обекты в LinkedList.  

Стоит ли для хранения пар делать обертку? 
Насколько критичен доступ по ключу?
В случае с предложенным способом, так как доступ к парам нужен прямой
Цитата(Royan @  25.4.2006,  16:34 Найти цитируемый пост)
на место второй пары записать другую пару ключ-значение

то использовать надо ArrayList а не LinkedList (последователльный доступ)

А как ты в ArrayList замениш один объект на другой с сохранением индекса? метод ArrayList.set(int index, Object element) познакомит тебя с  UnsupportedOperationException smile а вот в LinkedList он реализован, понятное дело smile 
PM   Вверх
ShamanTrirukiy
Дата 25.4.2006, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

import java.util.*;

public class Test {

  /**
   * @param args
   */
  public static void main(String[] args) {
    ArrayList al = new ArrayList<String>();
    al.add("1");
    al.add("2");
    al.add("3");
    System.out.println(al.toString());
    al.set(0, "4");
    System.out.println(al.toString());
  }

}


консоль:
[1, 2, 3]
[4, 2, 3]


Никакого 
Цитата(ALKS @  25.4.2006,  17:47 Найти цитируемый пост)
UnsupportedOperationException 

Или я что-то не так делаю? 

Хотя, по поводу недопустимости LinkedList-а  я загнался. Сори 

Это сообщение отредактировал(а) ShamanTrirukiy - 25.4.2006, 18:53
PM MAIL   Вверх
ALKS
Дата 26.4.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ха люботный случай. smile Не был метод set реализован в ArrayList даже в 1.4.2, а в 1.5 - уже реализовали. Я этого не знал.
Но в любом случае именно эта операция в LinkedList должна работать быстрее.
 
PM   Вверх
Ortega
Дата 26.4.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ALKS @ 26.4.2006,  10:19)
Ха люботный случай. smile Не был метод set реализован в ArrayList даже в 1.4.2, а в 1.5 - уже реализовали. Я этого не знал.
Но в любом случае именно эта операция в LinkedList должна работать быстрее.

Стоп-стоп-стоп. С каких это пор доступ по индексу в связном списке (в котором доступ по определению ПОСЛЕДОВАТЕЛЬНЫЙ) работает быстрее, чем он же, но в списке с ПРЯМЫМ доступом?? 
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок
PM MAIL WWW ICQ Skype GTalk   Вверх
ShamanTrirukiy
Дата 26.4.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ShamanTrirukiy @  25.4.2006,  17:37 Найти цитируемый пост)
Стоит ли для хранения пар делать обертку?

Подумал на досуге - если пары представлены разными объектами, то действительно стоит, а если одинаковыми - можно попробовать обойтись и массивом.

Цитата(ShamanTrirukiy @  25.4.2006,  18:11 Найти цитируемый пост)
Хотя, по поводу недопустимости LinkedList-а  я загнался. Сори 

Таки не загнался! ALKS, на больших объемах данных LinkedList убъёт приложение, а вот ArrayList даст ту самую возможность 
Цитата(Royan @  25.4.2006,  17:04 Найти цитируемый пост)
Максимально быстро менять пару (и ключ и значение), по заданному индексу

Посмотри исходники, и ты увидишь, что set(int index, Object element) в ArrayList сводится к замене элемента в массиве по заданному индексу
Цитата

Код

  E oldValue = elementData[index];
  elementData[index] = element;
  return oldValue;


в то время как в LinkedList идет перебор, хоть и оптимизмрованный, всех элементов до заданного 
Цитата

Код

  Entry<E> e = header;
  if (index < (size >> 1)) {
    for (int i = 0; i <= index; i++)
      e = e.next;
  } else {
    for (int i = size; i > index; i--)
       e = e.previous;
  }
  return e;


ArrayList изначально писался для обеспечения прямого доступа(по индексу), в то время как LinkedList заточен под последовательный доступ, и доступ к элементам в нем упирается в поэлементный обход коллекции.  

Это сообщение отредактировал(а) ShamanTrirukiy - 26.4.2006, 10:38
PM MAIL   Вверх
ALKS
Дата 26.4.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Внимательно перечетал доку. да LinkedList гомно... я-то наивно полагал что там нечто большее чем тупой сканиннг. могли бы B-дерево организовать что-ли... 

А вообще, если нужна действительно скорость - простые массивы. 

Это сообщение отредактировал(а) ALKS - 26.4.2006, 11:20
PM   Вверх
ShamanTrirukiy
Дата 26.4.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ALKS @  26.4.2006,  11:18 Найти цитируемый пост)
А вообще, если нужна действительно скорость - простые массивы. 

Это и есть ArrayList 
PM MAIL   Вверх
ALKS
Дата 26.4.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ShamanTrirukiy @ 26.4.2006,  11:41)
Цитата(ALKS @  26.4.2006,  11:18 Найти цитируемый пост)
А вообще, если нужна действительно скорость - простые массивы. 

Это и есть ArrayList

вот тут ты ошибаешся и сильно. как раз недавно читал статью. мужик пишет математические алгоритмы. двух и трехмерная упаковка объектов (есть такая область раскрой и упаковка). объектов сотни-тысяч/милионы так вот скорость работы с простыми масивами разительно выше, да и памяти жрет меньше smile

у меня в практике был случай - фуззи-поиск по ~300000 коротких строк. коллекции пошли лесом почти сразу и чуть позже пошел лесом String smile

вывод такой. если можете изначаьно оченить размер массива и если предполагаете что размр будет большой - ну скажем десятки тысяч элементов и выше - простые массивы. smile 
PM   Вверх
ShamanTrirukiy
Дата 26.4.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ALKS, не могу не согласиться.
Цитата(ALKS @  26.4.2006,  12:11 Найти цитируемый пост)
как раз недавно читал статью. мужик пишет математические алгоритмы. двух и трехмерная упаковка объектов (есть такая область раскрой и упаковка). объектов сотни-тысяч/милионы так вот скорость работы с простыми масивами разительно выше, да и памяти жрет меньше 

На статью линки нет?
  

Это сообщение отредактировал(а) ShamanTrirukiy - 26.4.2006, 12:17
PM MAIL   Вверх
Ortega
Дата 26.4.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ALKS @  26.4.2006,  11:18 Найти цитируемый пост)
да LinkedList гомно... 

зря ты так на него... Он хорош, когда с массивом чато производятся операции вставки/удаления 
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок
PM MAIL WWW ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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