Мене бентежить, що я не можу знайти швидку відповідь на це. По суті, я шукаю структуру даних у Java, яка реалізує java.util.List
інтерфейс, але яка зберігає своїх членів у відсортованому порядку. Я знаю, що ви можете використовувати звичайний ArrayList
і використовувати Collections.sort()
на ньому, але у мене є сценарій, коли я час від часу додаю та часто отримую членів зі свого списку, і я не хочу, щоб сортувати його кожного разу, коли я отримую учасника на випадок додано новий. Хто-небудь може вказати мені на таке, що існує в JDK або навіть у сторонніх бібліотеках?
РЕДАГУВАТИ : в структурі даних потрібно зберегти дублікати.
РЕЗЮМЕ ВІДПОВІДІ : Мені все це було дуже цікаво і я багато чому навчився. Aioobe, зокрема, заслуговує на увагу за його наполегливість у спробі досягти моїх вимог вище (в основному відсортована реалізація java.util.List, яка підтримує дублікати). Я прийняв його відповідь як найбільш точну для того, про що я просив, і найбільш спонукає до наслідків того, що я шукав, навіть якщо те, що я запитував, було не зовсім тим, що мені потрібно.
Проблема того, про що я просив, полягає в самому інтерфейсі List і концепції додаткових методів в інтерфейсі. Щоб процитувати javadoc:
Користувач цього інтерфейсу має точний контроль над тим, куди у списку вставляється кожен елемент.
Вставка у відсортований список не має точного контролю над точкою вставки. Потім вам слід подумати, як ви будете обробляти деякі з методів. Візьмемо add
для прикладу:
загальнодоступне логічне додавання (Об'єкт o)
Appends the specified element to the end of this list (optional operation).
Тепер ви опинилися в незручній ситуації: 1) розірвання контракту та реалізація відсортованої версії add; 2) надання дозволу на add
додавання елемента в кінець списку, порушення вашого відсортованого порядку; 3) залишення add
(як необов’язкове), UnsupportedOperationException
і реалізації іншого методу , який додає елементи в відсортованому порядку.
Варіант 3, мабуть, найкращий, але я вважаю несмачним наявність методу додавання, який ви не можете використовувати, та іншого методу sortedAdd, якого немає в інтерфейсі.
Інші супутні рішення (без певного порядку):
- java.util.PriorityQueue, який, мабуть, найближчий до того, що мені потрібно, ніж те, про що я просив. Черга - не найточніше визначення колекції об’єктів у моєму випадку, але функціонально вона робить все, що мені потрібно.
- net.sourceforge.nite.util.SortedList . Однак ця реалізація порушує контракт інтерфейсу List, реалізуючи сортування в
add(Object obj)
методі, і химерно не має методу ефекту дляadd(int index, Object obj)
. Загальний консенсус припускає, щоthrow new UnsupportedOperationException()
в цьому сценарії кращим вибором може бути. - TreeMultiSet від Guava Набір реалізацій, що підтримує дублікати
- ca.odell.glazedlists.SortedList Цей клас містить застереження у своєму javadoc:
Warning: This class breaks the contract required by List