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




Это похоже на SortedMap. С String в качестве ключа и Number в качестве значения.
Похоже, что SortedMap - это интерфейс, который, кстати, необходимо реализовать (что, по-видимому, и делает TreeMap).
Помимо SortedMap, у вас может быть , в котором вы предоставляете компаратор для сортировки пар (или заставляете свой класс Pair реализовывать Comparable и делать это там).TreeSet<Pair<String, Number>>
Это сохраняет объекты отдельно от структуры данных, и хотя для такого тривиального примера это не имеет большого значения, вы можете представить, что TreeSet <MyObject>, где MyObject реализует Comparable, легче найти в долгосрочной перспективе.
Думаю, стоит написать несколько тестов, а теперь у вас есть предложения SortedMap, TreeSet и TreeMap! Я думаю, что TreeXYZ будет быстрее получать итератор, карты быстрее для вставки / извлечения. Так что, возможно, TreeMap - лучший вариант в целом.
@JeeBee: TreeMap - единственная карта, которая реализует интерфейс SortedMap в стандартном API Java.
есть отличный запись в коллекции Java, который покрывает большинство ваших потребностей.
Краткий совет по этому поводу: используйте TreeMap (Comparator c) с настраиваемым компаратором. ключ - строка, значение - составной объект со строкой и числом
Спасибо за ссылку на Коллекции Java. Я искал что-то на Java, сопоставимое с описанием Строструпом C++ STL, и похоже, что это так.
Если у вас есть повторяющееся строковое значение среди объектов в списке, вы можете посмотреть 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.
Удивительно, но документация Javadocs действительно предоставляет достойную информацию об использовании и производительности доступных структур данных. Если вы посмотрите интерфейсы Map, Set и List, они укажут вам различные доступные реализации. Я не знаю, какую версию вы используете, поэтому я не ссылался напрямую.