Что было бы хорошим способом реализовать набор множеств со слабыми ссылками, сравнивать по ссылке, а также можно сортировать в Java? - PullRequest
2 голосов
/ 15 августа 2011

Я хочу иметь объект, который позволяет другим объектам определенного типа регистрироваться в нем.В идеале он будет хранить ссылки на них в некоторой коллекции наборов и будет сравнивать .equals () по ссылке, а не по значению.Он не должен постоянно поддерживать сортировку, но должен иметь возможность сортировки до итерации коллекции.

Просматривая библиотеку Java Collection, я видел различные функции, которые я 'Я ищу разные типы коллекций, но я не уверен, как мне использовать их для создания коллекций, которые я ищу.

Это Java в контексте Android, если это так.значительный.

Ответы [ 3 ]

2 голосов
/ 15 августа 2011

Встроенные в Java коллекции на основе дерева не будут работать.

Для иллюстрации рассмотрим дерево, содержащее слабые ссылки на узлы 'B', 'C' и 'D':

   C
B     D

Теперь давайте соберем слабую ссылку "C", оставив ноль позади:

   -
B     D

Теперь вставьте элемент в дерево.TreeMap / TreeSet не имеет достаточной информации для выбора левого или правого поддерева.Если ваш компаратор говорит, что нулевое значение является небольшим значением, то оно будет неправильным при вставке «А».Если он говорит, что null - это большое значение, он будет некорректным при вставке 'E'.

Сортировка по требованию - хороший выбор.

Более надежное решениеиспользовать ArrayList<WeakReference<T>> и реализовать Comparator<WeakReference<T>>, который делегирует Comparator<T>.Затем вызовите Collections.sort() до итерации.

Android's Collections.sort использует TimSort за кадром и поэтому он работает довольно эффективно, если входные данные уже частично отсортированы.

0 голосов
/ 15 августа 2011

Возможно, классы коллекций на уровне абстракции ниже того, что вы ищете?Похоже, что конечный продукт, который вы хотите, - это кэш с возможностью итерации в определенном пользователем порядке сортировки.Если это так, возможно, интерфейс кеша в библиотеке Google Guava достаточно близок к тому, что вы хотите:

http://code.google.com/p/guava-libraries/source/browse/trunk/guava/src/com/google/common/cache/Cache.java

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

List<Thing> cachedThings = Lists.newArrayList(cache.asMap().values());
Collections.sort(cachedThings, YOUR_THING_COMPARATOR);
for (Thing thing : cachedThings) { ... }

Даже если это не совсем то, что вы хотите, классы в этом пакете могут датьВы некоторые полезные идеи о: использование ссылок с коллекциями.

0 голосов
/ 15 августа 2011

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это был комментарий, но он стал довольно большим, извините, если он не решил вашу проблему:

Ссылки на Java

Просто чтобы уточнить, что я имею в виду, когда говорю "ссылка", поскольку на самом деле это не термин, обычно используемый в Java: Java не на самом деле использует ссылки или указатели.Он использует своего рода псевдо-ссылку, которую можно (и по умолчанию) назначить специальному экземпляру null.В любом случае, это один из способов объяснить это.В Java эти псевдо-ссылки являются единственным способом обработки Object.Когда я говорю «ссылка», я имею в виду эти псевдо-ссылки.

Наборы

Любая реализация Set не позволит двум ссылкам на один и тот же объект быть включенным в нее, поскольку она использует равенство идентичности дляэтот чек.Это нарушает математическую концепцию множества.Java Set игнорирует любую попытку добавить дублирующиеся ссылки.

Вы упомянули Map в своем комментарии, хотя ... Не могли бы вы уточнить, какая коллекция вы ищете?И зачем вам такая проверка на равенство?Вы думаете в терминах C ++?Я постараюсь отредактировать свой ответ, чтобы быть более полезным:)

РЕДАКТИРОВАТЬ: Я думал, что это может быть вашей целью;) Таким образом, TreeSet должен добиться цели тогда!Я не буду беспокоиться о производительности, пока не станет проблемой производительности.Простота является фантастической для удобочитаемости, обслуживания и предотвращения ошибок.Если производительность становится проблемой, в идеале вы должны профилировать свой код и оптимизировать только те области, которые доказали как проблему.

...