Я новичок в Java. Пожалуйста, предложите, какую коллекцию (ы) можно / нужно использовать для поддержания отсортированного списка в Java. Я пытался Map
и Set
, но они были не то, что я искал.
источник
Я новичок в Java. Пожалуйста, предложите, какую коллекцию (ы) можно / нужно использовать для поддержания отсортированного списка в Java. Я пытался Map
и Set
, но они были не то, что я искал.
Это приходит очень поздно, но в JDK есть класс только для того, чтобы иметь отсортированный список. Он назван (несколько не в порядке с другими Sorted*
интерфейсами) " java.util.PriorityQueue
". Он может сортировать Comparable<?>
s или используя Comparator
.
Разница с использованием List
отсортированного использования Collections.sort(...)
заключается в том, что он всегда будет поддерживать частичный порядок с эффективностью вставки O (log (n)), используя структуру данных кучи, тогда как вставка в отсортированный ArrayList
будет O (n) (т.е. используя бинарный поиск и перемещение).
Однако, в отличие от a List
, PriorityQueue
не поддерживает индексированный доступ ( get(5)
), единственный способ получить доступ к элементам в куче - вынимать их по одному (таким образом, имя PriorityQueue
).
TreeMap и TreeSet дадут вам итерацию по содержимому в отсортированном порядке. Или вы можете использовать ArrayList и использовать Collections.sort () для его сортировки. Все эти классы находятся в java.util
источник
Если вы хотите сохранить отсортированный список, который вы будете часто изменять (т.е. структуру, которая, помимо сортировки, допускает дублирование и на элементы которой можно эффективно ссылаться по индексу), то используйте ArrayList, но когда вам нужно вставить элемент Всегда используйте Collections.binarySearch () для определения индекса, по которому вы добавляете данный элемент. Последний метод сообщает вам индекс, который нужно вставить, чтобы сохранить список в отсортированном порядке.
источник
Используйте класс GoogleMava TreeMultiset . Guava имеет впечатляющий API коллекций.
Одной из проблем, связанных с предоставлением реализации List, которая поддерживает отсортированный порядок, является обещание, данное в JavaDocs
add()
метода.источник
List
всегда добавляет в конце.Вы хотите реализации SortedSet , а именно TreeSet .
источник
Есть несколько вариантов. Я бы предложил TreeSet, если вам не нужны дубликаты, а вставляемые объекты сравнимы.
Вы также можете использовать статические методы класса Collections для этого.
См. Collections # sort (java.util.List) и TreeSet для получения дополнительной информации.
источник
Если вы просто хотите отсортировать список, используйте любой вид List и используйте Collections.sort () . Если вы хотите убедиться, что элементы в списке уникальны и всегда сортируются, используйте SortedSet .
источник
Что я сделал, так это реализовал List, имеющий внутренний экземпляр со всеми делегированными методами.
После этого я реализовал новый метод "putOrdered", который вставляет в нужную позицию, если элемент не существует, или заменяет его на случай, если он существует.
Если вы хотите разрешить повторяющиеся элементы, просто используйте вместо этого addOrdered (или оба).
Если вы хотите избежать вставок, вы также можете выдать исключение и неподдерживаемую операцию для методов «add» и «set».
... а также Вы должны быть осторожны с методами ListIterator, потому что они могут изменить ваш внутренний список. В этом случае вы можете вернуть копию внутреннего списка или снова выдать исключение.
источник
List
договор. Может быть, было бы лучше только реализоватьCollection
. И еслиContactList
отсортировано, тоcontains()
может быть реализовано с использованиемbinarySearch
также, чтобы быть более эффективным.Самый эффективный способ реализовать отсортированный список, как вы хотите, - это реализовать индексируемый скип-лист, как здесь: Wikipedia: Индексируемый скип-лист . Это позволило бы иметь вставки / удаления в O (log (n)) и позволило бы иметь индексированный доступ одновременно. И это также позволило бы дубликаты.
Skiplist - довольно интересная и, я бы сказал, недооцененная структура данных. К сожалению, в базовой библиотеке Java нет индексированной реализации списка пропусков, но вы можете использовать одну из реализаций с открытым исходным кодом или реализовать ее самостоятельно. Существуют регулярные реализации Skiplist, такие как ConcurrentSkipListSet и ConcurrentSkipListMap
источник
TreeSet не будет работать, потому что они не допускают дублирования, плюс они не предоставляют метод для извлечения элемента в определенной позиции. PriorityQueue не будет работать, потому что он не позволяет извлекать элементы в определенной позиции, что является основным требованием для списка. Я думаю, что вам нужно реализовать свой собственный алгоритм для поддержки отсортированного списка в Java с O (logn) время вставки, если вам не нужны дубликаты. Возможно, решением может быть использование TreeMap, где ключ является подклассом элемента, переопределяющего метод equals, так что допускаются дубликаты.
источник
Использование LambdaJ
Вы можете попробовать решить эти задачи с помощью LambdaJ, если вы используете предыдущие версии для Java 8. Вы можете найти его здесь: http://code.google.com/p/lambdaj/
Вот вам пример:
Сортировать Итеративный
Сортировка с помощью LambdaJ
Конечно, такая красота влияет на производительность (в среднем 2 раза), но можете ли вы найти более читаемый код?
Сортировка с Java 8, используя лямбда-выражения
источник
-(p1.getAge().compareTo(p2.getAge()))
Проблема с PriorityQueue заключается в том, что он поддерживается простым массивом, а логика, которая приводит элементы в порядок, выполняется штукой "queue [2 * n + 1] и queue [2 * (n + 1)]". Это прекрасно работает, если вы просто тянете с головы, но делает его бесполезным, если вы пытаетесь вызвать .toArray для него в какой-то момент.
Я обхожу эту проблему, используя com.google.common.collect.TreeMultimap, но я поставляю собственный компаратор для значений, заключенных в упорядочение, который никогда не возвращает 0.
ех. для двойной:
Таким образом, я получаю значения в порядке, когда я вызываю .toArray (), а также есть дубликаты.
источник
То, что вы хотите, это двоичное дерево поиска. Он поддерживает отсортированный порядок, предлагая логарифмический доступ для поиска, удаления и вставки (если у вас нет вырожденного дерева - тогда оно линейное). Это довольно легко реализовать, и вы даже можете заставить его реализовать интерфейс List, но тогда доступ по индексу усложняется.
Второй подход - иметь ArrayList, а затем реализацию с сортировкой пузырьков. Поскольку вы вставляете или удаляете по одному элементу за раз, время доступа для вставок и удалений является линейным. Поиски являются логарифмической и индексной константой доступа (времена для LinkedList могут отличаться). Единственный код, который вам нужен, - это 5, может быть, 6 строк пузырьковой сортировки.
источник
Вы можете использовать Arraylist и Treemap, так как вы сказали, что вам также нужны повторные значения, тогда вы не можете использовать TreeSet, хотя он также отсортирован, но вам нужно определить компаратор.
источник
Для Set вы можете использовать TreeSet. TreeSet упорядочивает свои элементы на основе естественного упорядочения или любого порядка сортировки, передаваемого в Comparable для этого конкретного объекта. Для карты используйте TreeMap. TreeMap обеспечивает сортировку по ключам. Чтобы добавить объект в качестве ключа в TreeMap, этот класс должен реализовать сопоставимый интерфейс, который, в свою очередь, заставляет реализовать метод сравнения с (), который содержит определение порядка сортировки. http://techmastertutorial.in/java-collection-impl.html
источник
Используйте метод sort () для сортировки списка, как показано ниже:
Для справки смотрите ссылку: http://tutorials.jenkov.com/java-collections/sorting.html
источник
Использование,
TreeSet
которое дает элементы в отсортированном порядке. ИЛИ использоватьCollection.sort()
для внешней сортировки сComparator()
.источник
источник
с Java 8 Comparator, если мы хотим отсортировать список, то вот 10 самых населенных городов мира, и мы хотим отсортировать их по названию, как сообщает Time. Осака, Япония. ... Мехико, Мексика. ... Пекин, Китай. ... Сан-Паулу, Бразилия. ... Мумбаи, Индия. ... Шанхай, Китай. ... Дели, Индия. ... Токио, Япония.
источник
Сортировка ArrayList в соответствии с заданными пользователем критериями.
Модельный класс
Класс сортировки
Основной класс
Вывод
источник