Размер кажется ненужным усилием. Кроме того, использование хорошо известной и поддерживаемой библиотеки, такой как Guava, может сэкономить вам время разработки и обеспечить лучшую надежность.
ответил 11 октября 2012 года в 8:07
6 872 4 4 Золотые значки 23 23 Серебряные значки 46 46 Бронзовые значки
В свете разъяснения я бы предложил вам использовать B+ дерево. Эта часто используемая структура данных гарантирует сортированный заказ, позволяет дубликаты и обеспечивает эффективную операции внедрения и обновления. Он также предлагает быстрые возможности поиска и перевозки диапазона.
ответил 11 октября 2012 года в 7:41
26.7K 51 51 Золотые значки 182 182 Серебряные значки 254 254 Бронзовые значки
Было бы очень портативно с банкой Mavon и без внешних зависимостей (хотя библиотека CL + модульный тест может быть хорошим, но я переключил тестирование на Junit)
11 октября 2012 года в 8:59
Вы можете использовать Treemap. Он реализован с помощью красного черного дерева, позволяет дубликаты и предлагает логарифмическую временную сложность для внедрения и поисковых операций. Кроме того, TreeMap включен в стандартную библиотеку Java, поэтому у вас не будет никаких внешних зависимостей.
ответил 11 октября 2012 года в 8:48
12.9k 11 11 Золотые значки 57 57 Серебряные значки 77 77 Бронзовые значки
Что касается производительности: LinkedList является самым медленным. Затем наступает ArrayList. Другие реализации масштабируются с количеством элементов.
11 октября 2012 года в 7:10
Использование LinkedList или ArrayList и сортировка перед каждой операцией поиска действительно будет неэффективной. Если вам нужна отсортированная коллекция, которая позволяет дубликаты и обеспечивает быструю вставку и обновление, вы можете рассмотреть возможность использования списка Skip. Он имеет сходную временную сложность как сбалансированное бинарное дерево поиска, но избегает операций балансировки.
ответил 11 октября 2012 года в 8:33
34.7K 49 49 Золотые значки 129 129 Серебряные значки 158 158 Бронзовые значки
У вас есть много вариантов для отсортированных коллекций, которые позволяют дублировать. Некоторые из популярных вариантов:
- Treesset: реализует интерфейс SortedSet в Java. Он поддерживается тройной и обеспечивает эффективную вставку, удаление и поисковые операции.
- TreeMultiset (от Guava): этот класс предоставляет отсортированную коллекцию, которая позволяет дубликатам, используя поддержку TreeMultiset.
- CORCURRENTSKIPLISTSET: это одновременная реализация интерфейса SortedSet. Он использует список пропуска в качестве основной структуры данных.
- B+ дерево: самобалансирующее дерево поиска, которое обычно используется в базах данных для обеспечения быстрых поисков клавиш.
В конечном счете, выбор зависит от ваших конкретных требований и компромиссов. Важно учитывать такие факторы, как сложность, эффективность памяти, производительность и простота использования. Вы можете экспериментировать с различными вариантами и сравнить их, чтобы найти наиболее подходящее решение для вашего варианта использования.
ответил 29 июня 2021 года в 9:20
1781 3 3 Золотые значки 11 11 Серебряные значки 30 30 бронзовых значков
Java: отсортированная коллекция, которая позволяет дубликаты, эффективна память и обеспечивает быстрое обновление вставки
Я не собираюсь спрашивать о причинах такого поведения приоритетов, так как обсуждение здесь охватывает, что довольно хорошо. Однако я хочу спросить, есть ли какие -нибудь альтернативы, о которых я не знаю?
Сортированный набор разрешает дубликаты?
Заказанный набор содержит уникальные элементы в отсортированном порядке, как набор. Во время работы с упорядоченным набором с дублирующими элементами используется тип пары вместо Int, где первое значение пары будет хранить элемент, а второе значение будет хранить соответствующие индексы. Выполняя это каждая пара в упорядоченном наборе будет уникальной, и можно легко сохранить дублируемые элементы массива.
Операции:
1. order_of_key (): Он принимает элемент в качестве параметра и возвращает количество элементов строго меньше, чем ключ. При его реализации, нам нужно передать пару в качестве параметра, первое значение которого должно быть число, которое мы хотим, чтобы результат, и второе значение будет содержать отрицательное значение e.г., -1 Поскольку вставленные пары в упорядоченном_SET будут иметь значение больше, чем равное 0, поскольку это обозначает индексы массива.
2. find_by_order (): Он принимает индекс в качестве параметра и возвращает итератор в элемент (пара) в отсортированном порядке.
Пример:
Предположим, что есть упорядоченная пара пара myset =
Здесь,
- За упорядоченная пара сет.
- После вставки всех элементов в orsored_set_pair,
- myset.order_of_key (): Это даст количество элементов менее 5 я.E, 6.
- myset.find_by_order (8): Это даст итератор 8 -м элементу в упорядоченном наборе I.E, 7.
Ниже приведена программа C ++ для реализации вышеуказанного подхода:
Java: отсортированная коллекция, которая позволяет дубликаты, эффективна память и обеспечивает быструю вставку + обновление
Любой с лучшими предложениями? Или я должен роль моей собственной сортированной данных (какая из них?)? Также были бы другие источники (в Java, с открытым исходным кодом, с модульными тестами и небольшими DEP).
Обновлять
Более подробная информация о моем варианте использования в данный момент (хотя у меня в последний раз есть аналогичный спрос). У меня есть коллекция (с миллионами) ссылок, где я хочу иметь возможность
- опросить или получить самый маленький элемент в области поля S
- и обновить поле S с помощью поля A
- могут произойти идентичные значения поля S. Поле A на самом деле является целым числом, указывающим на другой массив
- Единственная зависимость, которую я хочу, – это trove4j. Я мог бы использовать такие, как коллекции Mahout, если это потребуется. Но не гуава, как, несмотря на то, что хорошая либера.
Таким образом, все крики о куче Фибоначчи, но я боюсь.
1 1 1 Серебряный значок
спросил 10 октября 2012 года в 20:15
17K 16 16 Золотые значки 97 97 Серебряные значки 196 196 Бронзовые значки
В чем была проблема с использованием гуавов TreeMultiset ?
10 октября 2012 года в 20:22
@Vainolo внешняя зависимость в соответствии с замечанием OP.
10 октября 2012 года в 20:24
Может быть полезен – Cheatsheet Ceatsheet: Bigocheatsheet.компонент
11 июля 2017 года в 14:29
6 ответов 6
Когда вам нужна отсортированная коллекция, вы должны тщательно проанализировать ваши потребности.
Если большинство операций вставка и лишь немногие должны искать, а затем используя отсортированную коллекцию I.эн. Держите элементы отсортированными в коллекции постоянно, Не был бы хорошим вариантом (из -за накладных расходов на сортировку элементов на вставке, которая была бы наиболее распространенной операцией).
В этом случае было бы лучше сохранить несортированный Сбор и выполните сортировку только при необходимости. я.эн. перед поиском. Вы даже можете использовать простой список и сортировать его (используя коллекции.сортировка я.эн. Mergesort) при необходимости. Но я рекомендую это с осторожностью, так как это будет эффективным, предполагается, что вы работаете над большими данными. В действительно небольших данных даже линейный поиск достаточно хорош.
Если большинство операций идет поиск Затем вы можете использовать отсортированную коллекцию, которая с моей точки зрения, есть структуры данных на выбор (некоторые из которых вы уже упоминаете), и вы можете понять, какой из них подходит твой потребности.
ответил 10 октября 2012 года в 20:25
52.7k 66 66 Золотые значки 207 207 Серебряные значки 338 338 Бронзовые Значки
Это не отвечает на вопрос, это действительно просто переставляет его
28 июня 2021 года в 20:51
А как насчет гуаво? Что вы просили: отсортированная коллекция, которая принимает дубликаты. Хотя ничего не знаю о его производительности.
3280 5 5 Золотые значки 35 35 Серебряные значки 49 49 Бронзовые значки
ответил 10 октября 2012 года в 20:21
6 872 4 4 Золотые значки 23 23 Серебряные значки 46 46 Бронзовые значки
Я уже добавил это, но я думаю (еще не посмотрел на код), что реализация почти идентична карту
10 октября 2012 года в 21:22
Кажется из кода совершенно новой реализацией. Много -много кода. И вы можете скачать источник и добавить его в свой проект, так в чем проблема? лицензирование?
10 октября 2012 года в 21:28
размер банки. Мое приложение должно быть маленьким и портативным.
11 октября 2012 года в 7:10
Как насчет использования таких инструментов, как Proguard для сжатия JAR после завершения программирования? Написание собственной библиотеки только из -за размера банки не очень хорошая инвестиция в ваше время.
11 октября 2012 года в 7:38
Ну, я хотел бы сохранить свой (открытый) проект в чистоте и только с несколькими зависимостями. И только из -за одной данных я определенно не буду зависеть от всей библиотеки. У меня уже есть trove4j, и я не хочу еще одну коллекцию
11 октября 2012 года в 9:53
Я решил свернуть свое собственное, но не оптимальное решение, просто вариант TreeMap. Я буду держать это в обновлении. Скорость уже намного лучше, чем предыдущая попытка приоритета, так как мне нужна коллекция.удалить (объект) метод (для обновления записи):
пакет com.График.колл; Импорт GNU.подъемник.итератор.Tintiterator; Импорт GNU.подъемник.набор.хэш.Tinthashset; Импорт Java.утилит.карта.Вход; Импорт Java.утилит.Treemap; /*** Приоритетная очередь, реализованная TREEMAP, чтобы разрешить быстрое обновление ключей. Или мы должны использовать стандартную * B-три? */ public class mysortedcollection < private int size; private int slidingMeanValue = 20; private TreeMapmap; public MySortedCollection(int size) < map = new TreeMap(); > void удалить (int key, int value) < TIntHashSet set = map.get(value); if (set == null || !set.remove(key)) throw new IllegalStateException("cannot remove key " + key + " with value " + value + " - did you insert " + key + "," + value + " before?"); size--; if (set.isEmpty()) map.remove(value); >Обнаружение Public void (int Key, int oldValue, int value) < remove(key, oldValue); insert(key, value); >public void вставка (int key, int value) < TIntHashSet set = map.get(value); if (set == null) map.put(value, set = new TIntHashSet(slidingMeanValue)); // else // slidingMeanValue = Math.max(5, (slidingMeanValue + set.size()) / 2); if (!set.add(key)) throw new IllegalStateException("use update if you want to update " + key); size++; >public int peekvalue () < if (size == 0) throw new IllegalStateException("collection is already empty!?"); Entrye = map.firstEntry(); if (e.getValue().isEmpty()) throw new IllegalStateException("internal set is already empty!?"); return map.firstEntry().getKey(); > public int peekkey () < if (size == 0) throw new IllegalStateException("collection is already empty!?"); TIntHashSet set = map.firstEntry().getValue(); if (set.isEmpty()) throw new IllegalStateException("internal set is already empty!?"); return set.iterator().next(); >public int pollkey () < size--; if (size < 0) throw new IllegalStateException("collection is already empty!?"); Entrye = map.firstEntry(); TIntHashSet set = e.getValue(); TIntIterator iter = set.iterator(); if (set.isEmpty()) throw new IllegalStateException("internal set is already empty!?"); int val = iter.next(); iter.remove(); if (set.isEmpty()) map.remove(e.getKey()); return val; > Public Int Size () < return size; >Общественный логический Isempty () < return size == 0; >public int getsLidingMeanValue () < return slidingMeanValue; >@Override public String toString () < return "size " + size + " min=(" + peekKey() + "=>" + peekvalue () +") ";>>
Сортированная коллекция, позволяющая дубликатам?
Опубликовано 13 лет назад
Количество кусочков для отправки:
Необязательно «спасибо» примечание:
После короткого устранения неполадок, когда я не мог понять, почему мой в моих глазах сортировал приоритетные приоритеты, выплюнул его элементы несортированным образом, я читал Javadoc и понял, что итератор PriorityQue. Другими словами, приоритет нельзя рассматривать как сортированная коллекция. Причина, по которой деревья не вариант, заключается в том, что мне нужна коллекция, чтобы разрешить дубликаты. И я хочу, чтобы это всегда было отсортировано, без использования коллекций.Сортировать().
Я не собираюсь спрашивать о причинах такого поведения приоритетов, так как обсуждение здесь охватывает, что довольно хорошо. Однако я хочу спросить, есть ли какие -нибудь альтернативы, о которых я не знаю?
Итак, подвести итог, что мне нужна, это коллекция, которая:
Такая коллекция в Java API? Или мои требования слишком надуманны? Любые предложения по лучшему и чистую способ решить это? И производительность не беспокоит меня, так как в общей сложности коллекция никогда не будет содержать больше, чем несколько сотен элементов.
Маршал
Сообщения: 77786
Опубликовано 13 лет назад
Количество кусочков для отправки:
Необязательно «спасибо» примечание:
Я думаю, вам придется написать свой собственный. То, что вы описываете, – это список, который принимает естественный заказ, а не порядок введения в качестве его упорядочения. Напишите обертку вокруг реализации списка; Используйте двоичный поиск, чтобы найти точку вставки в вашем методе Add (e) и бросьте AnunSupportEdoPerationException из метода add (int, e). Обратите внимание, что ваш класс обертки должен будет реализовать список
Шериф
Сообщения: 22739
Опубликовано 13 лет назад
Количество кусочков для отправки:
Необязательно «спасибо» примечание:
Кэмпбелл Ричи писал: и бросить AnunSupportEdoPerationException из метода add (int, e). Обратите внимание.
Класс обертки не нуждается в списке; Вместо этого реализовать коллекцию. Список добавляет три вещи, которых у коллекции нет:
1) Указанный заказ
2) Индексирование элементов
3) Перемещение как вперед, так и назад с ListerIterator
Поскольку вам, вероятно, не понадобится 2 или 3. Если вы реализуете список, вы усложняете для себя, потому что добавить (int, e) не единственное место, где вы можете сломать сортированный заказ:
– addall (int, collection) также позволяет добавлять в любое место (другое UnsupportedOperationException)
– SET (int) позволяет перезаписать элемент с любым другим элементом (другой UnsupportedOperationException)
– Вам нужно защитить список, возвращенный сублистом (вы можете обернуть его в новую обертку)
– Вам нужно защитить свой список, он также позволяет добавлять и заменить элементы (вам понадобится еще один класс обертки)
И что дает список, что вы можете хотеть? get (int), indexof (объект), lastindexof (object), sublist (int, int). Но вам действительно нужны эти? У их в коллекции нет, у SET их нет, (приоритетная) в очереди их нет.
SCJP 1.4 – SCJP 6 – SCWCD 5 – OCEEJBD 6 – OCEJPAD 6
Как задать вопросы, как ответить на вопросы
Джими Сведенхольм
Ранчо Рука
Опубликовано 13 лет назад
Количество кусочков для отправки:
Необязательно «спасибо» примечание:
Хорошо, я думал еще немного, и у меня есть несколько вариантов выбора между:
Вариант 3 был моей первой мыслью, так как, на мой взгляд, это должно быть довольно легко. Но оказалось, что на самом деле это было не так просто. То, что я пытаюсь сортировать, – это объекты, которые реализуют интерфейс org.Springframework.основной.Заказал. Уже есть компаратор для упорядоченных объектов, однако, если номер порядка обоих объектов одинаково, то компаратор просто возвращает 0. Но я хочу, чтобы он вернулся 0, только если объекты действительно равны друг другу. Потому что будут упорядоченные объекты, которые далеки от равных, но с тем же номером заказа. Если компаратор возвращает 0, то TreesSet считает, что эти объекты равны.
Проблема, которая у меня есть, заключается в том, чтобы решить, следует ли рассматривать элемент E1 меньше или больше, чем элемент E2, когда E1.getorder () == e2.getorder (). Что я сделал сейчас, в реализации теста, так это:
У меня нет проблем с несколько сложными этапами, так как это редко пройдет весь путь до E или F Asuming Good Hashcode реализации. Проблема, с которой я столкнулся с последним шагом, f. Потому что это нарушает договор сопоставимого. Если сравнение (e1, e2) сводится к F, то результат составляет -1, но результат сравнения (E2, E1) составляет * также * -1! Даже если это вряд ли когда -нибудь произойдет, это * может * случиться.
Что вы, ребята, думаете об этом компараторе? Это было «просто неправильно», когда я написал это, но мне также не нравится, как это орг.Springframework.основной.OrderComparator написан, поскольку он может рассмотреть неравные объекты (как O1.равно (O2)) быть равным (возвращая 0). Или, когда я думаю об этом, мой * Real * Pet Peve – это интерфейс SET, который четко заявляет, что он считает объекты равными, если сравнение/сравнение приводит к 0. Что должно сделать, если вы спросите меня, это сделать последующий вызов O1.равны (O2) и считают их дубликатами, если он возвращает истинность.
Но так как внедрение сет не изменится в ближайшее время (или вообще нет) в этом отношении, я начинаю наклоняться к варианту 2 выше, так как он проще, а затем опция 1 и чище, затем вариант 3.
Кэмпбелл Ричи
Маршал
Сообщения: 77786
Опубликовано 13 лет назад
Количество кусочков для отправки:
Необязательно «спасибо» примечание:
Кораптор, согласующийся с равными, звучит хорошей идеей, но если вы используете его с помощью деревьев, вы не получите дубликатов.
Джими Сведенхольм
Ранчо Рука
Опубликовано 13 лет назад
Количество кусочков для отправки:
Необязательно «спасибо» примечание:
Кэмпбелл Ричи писал: Кораптор, согласующийся с равными, звучит хорошей идеей, но если вы используете его с деревьями, вы не получите дубликатов.
Ну, здесь есть два разных вида равенства/двуличия*. Кораптор считает два элемента равенства, если «сравнение-колькуляция» приводит к 0. И это, по-видимому, единственное, что делает сортировка. Но как я вижу, это узкое определение равных является неадекватным. Объекты только «равны» в глазах компаратора, но сортированный набор должен использовать только компаратор для сортировка, не двуличные проверки. Если два элемента имеют «сравнение-результат» 0, но там, где Equals () возвращает ложь, то это должно просто считать это «не дубликатами, но порядок не имеет значения».
Но, может быть, кто-то может объяснить причину этой недостатки в глазах? Почему он доверяет сравнению/сравнению в отношении проверки двуличих, не делая правильный equals () проверить? Я читал Javadoc, но все это говорит, это то, что он реализован. Производительность?
Итак, чтобы вернуться к моему первоначальному сообщению. Когда я говорил о дубликатах, я имел в виду дубликаты в соответствии с точки зрения компараторов, и причина, по которой я использовал это определение, заключалась в том, что это определение, которое использует SortedSet. У меня нет причин положить истинный дубликаты (т.е. где O1.равно (O2)) в коллекции.
Решение, к которому я склоняюсь, – это создать мою собственную коллекцию (т.е. «Collection Collection») с внутренним массивным списком. Эта коллекция просто делегирует все методы вызовов в ArrayList, но до того, как методы Toarray и итератора называются я сортирую ArrayList, используя предоставленный компаратор. Бонусный результат этого по сравнению с «вариантом 3» выше – это то, что это решение не имеет проблем с изменчивыми элементами, где поле (ы), которое используется для сравнения, может измениться после того, как оно было добавлено в сборку. Сорт -набор, вероятно, не сможет иметь дело с этим сценарием элегантно.
Любые комментарии к этому решению?
* Три, если вы рассмотрите ‘==’, но это всего лишь особый случай Equals ().
Как разрешить дубликаты
ВОЗМОЖНО, АДРЕСАНА Экттрон, в то время как.
Отсортированные наборы в Redis не разрешали дубликаты. Можем ли мы разрешить дубликаты в отсортированных наборах ?
—
С уважением,
Манула Thantriwatte .
Бакалавриат | Университет Коломбо Школа вычислительной техники
Шри -Ланка
Демис Белло
nproshytanono,
23 февраля. 2011 г., 09:28:47 23.02.2011 год
Написание
Чtobы otwoTiTTH Автор
Чtobы -pereSlath soobщenieene, wohйdite -scstemymy
Wyas raзrehenhyna yaraleonee ofoebщeniй-.
Покало
Чtobы opohlowath -nan nan ancoephebenee, vvoйdiote -scstemymy
Покара
ВОЗМОЖНО, АДРЕСАНА Экттрон, в то время как.
– Реди. @googlegroups.com, Manula Thantriwatte
Вы уверены, что не хотите использовать список? Как набор по определению не содержит дубликатов.
—
Вы получили это сообщение, потому что вы подписались на группу Google “Redis DB”.
Чтобы опубликовать эту группу, отправьте электронное письмо в Redi. @googlegroups.компонент.
Чтобы отписаться от этой группы, отправьте электронное письмо в Redis-DB+U. @googlegroups.компонент.
Для получения дополнительных вариантов, посетите эту группу по адресу http: // groups.Google.com/group/redis-db?hl = en.
Дидье Спезия
nproshytanono,
23 февраля. 2011 г., 10:18:24 23.02.2011 год
Написание
Чtobы otwoTiTTH Автор
Чtobы -pereSlath soobщenieene, wohйdite -scstemymy
Wyas raзrehenhyna yaraleonee ofoebщeniй-.
Покало
Чtobы opohlowath -nan nan ancoephebenee, vvoйdiote -scstemymy
Покара
ВОЗМОЖНО, АДРЕСАНА Экттрон, в то время как.
Если вы пытаетесь создать упорядоченную, не уникальную индексацию
Структура данных и действительно застряла с Redis, вы можете
Хочу взглянуть на базу данных алхимии Jak Sprats.
Он остается в основном совместимым с Redis, но может соответствовать вашему
требует лучшего из-за его поддержки индексов Btree в памяти.
Если вам нужно обсудить об этом, используйте
Выделенная группа.
23 Fév, 09:25, Manula Thantriwatte
написал:
Уилл Майер
nproshytanono,
23 февраля. 2011 г., 12:27:05 23.02.2011 год
Написание
Чtobы otwoTiTTH Автор
Чtobы -pereSlath soobщenieene, wohйdite -scstemymy
Wyas raзrehenhyna yaraleonee ofoebщeniй-.
Покало
Чtobы opohlowath -nan nan ancoephebenee, vvoйdiote -scstemymy
Покара
ВОЗМОЖНО, АДРЕСАНА Экттрон, в то время как.
– Реди. @googlegroups.компонент
В среду, 23 февраля 2011 года в 01:55:16 +0530, Манула Thantriwatte написал:
> Сортированные наборы в Redis не разрешали дубликаты. Можем ли мы разрешить дубликаты в
> Сортированные наборы ?
Обычный трюк включает в себя составление значений в наборе, используя оценку. На время
серии данных, где оценка является временной меткой, а значение – это число, это
должно быть достаточно, чтобы сохранить уникальность потенциально повторяющихся значений.
Например:
Zadd Time.Серия 1298460338 “1298460348 9”
Zadd Time.Серия 1298460348 “1298460348 10”
Zadd Time.Серия 1298460358 “1298460358 11”
Ваш клиент должен был бы разделить значения, которые он получает от Redis, по порядку
Чтобы получить фактическую ценность.