Кисть структуры данных (Java)

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

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

Есть ли что-то для этого в стандартных библиотеках Java?

Удивительно, но документация Javadocs действительно предоставляет достойную информацию об использовании и производительности доступных структур данных. Если вы посмотрите интерфейсы Map, Set и List, они укажут вам различные доступные реализации. Я не знаю, какую версию вы используете, поэтому я не ссылался напрямую.

Spencer Kormos 03.12.2008 19:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
1
1 718
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Это похоже на SortedMap. С String в качестве ключа и Number в качестве значения.

Похоже, что SortedMap - это интерфейс, который, кстати, необходимо реализовать (что, по-видимому, и делает TreeMap).

Daddy Warbox 03.12.2008 18:53

Помимо SortedMap, у вас может быть

TreeSet<Pair<String, Number>>
, в котором вы предоставляете компаратор для сортировки пар (или заставляете свой класс Pair реализовывать Comparable и делать это там).

Это сохраняет объекты отдельно от структуры данных, и хотя для такого тривиального примера это не имеет большого значения, вы можете представить, что TreeSet <MyObject>, где MyObject реализует Comparable, легче найти в долгосрочной перспективе.

Думаю, стоит написать несколько тестов, а теперь у вас есть предложения SortedMap, TreeSet и TreeMap! Я думаю, что TreeXYZ будет быстрее получать итератор, карты быстрее для вставки / извлечения. Так что, возможно, TreeMap - лучший вариант в целом.

JeeBee 03.12.2008 18:05

@JeeBee: TreeMap - единственная карта, которая реализует интерфейс SortedMap в стандартном API Java.

Powerlord 03.12.2008 18:41
Ответ принят как подходящий

есть отличный запись в коллекции Java, который покрывает большинство ваших потребностей.

Краткий совет по этому поводу: используйте TreeMap (Comparator c) с настраиваемым компаратором. ключ - строка, значение - составной объект со строкой и числом

Спасибо за ссылку на Коллекции Java. Я искал что-то на Java, сопоставимое с описанием Строструпом C++ STL, и похоже, что это так.

Rich 05.12.2008 20:05

Если у вас есть повторяющееся строковое значение среди объектов в списке, вы можете посмотреть TreeMultimap Google Коллекций. С помощью TreeMultimap не только сортируются ключи, но и все значения, имеющие один и тот же ключ, также сохраняются в коллекции.

Multimap<String, Pair> mm = new TreeMultimap<String, Pair>(
      new Comparator<String>(){...}, 
      new PairComparator());
mm.put("A", new Pair("A", 1));
mm.put("B", new Pair("B", 2));
mm.put("B", new Pair("B", 3));
Collection values = mm.values(); 
   // values are [Pair("A", 1), Pair("B", 2), Pair("B", 3)]
Collection bValues = mm.get("B"); 
   // bValues are [Pair("B", 2), Pair("B", 3)]

Я сделал что-то подобное, я использовал ArrayList для хранения их объектов и написал компараторы для сортировки arrayylist.

Другие вопросы по теме