#java #hashtable
#java #хэш-таблица
Вопрос:
У меня есть хэш-таблица, которая содержит строковый ключ и значение объекта класса:
Hashtable<String,myclass>m_class_table = new Hashtable<String,myclass>();
внутри ‘myclass’ у меня есть значение строкового поля,
Мне нужно отсортировать мою хэш-таблицу в соответствии с этим строковым значением.
Я не могу просто отсортировать ее по значениям хэш-таблицы, потому что это объект..
Как это можно сделать?
Заранее благодарю.
Комментарии:
1. Хэш-таблицы не могут быть отсортированы… это противоречит контракту класса. Вместо этого взгляните на TreeMap.
2. @stevevls: Я могу отсортировать ее, поместив набор ключей внутрь arraylist, а затем поместить его в коллекцию и отсортировать..
3. Строковые ключи, эквивалентны ли они строковому полю myclass-объекта, на который он указывает?
4. Это дает вам новую отсортированную коллекцию. Она не сортирует саму хэш-таблицу. Возможно, вам нужно немного переформулировать свой вопрос.
Ответ №1:
Мне нужно отсортировать мою хэш-таблицу в соответствии с этим строковым значением.
Хэш-таблица не является отсортированной структурой данных.
Вы можете использовать некоторые из них SortedMap
, такие как a TreeMap
, но эти структуры данных сортируются по ключам, так что это сработает, только если ключ равен строковому полю объекта, на который указано.
Я не могу просто отсортировать ее по значениям хэш-таблицы, потому что это объект..
Вам нужно предоставить Comparator<myclass>
или позволить myclass
реализовать Comparable
интерфейс.
В зависимости от того, как вы выполняете итерацию по хэш-таблице, возможно, вы могли бы поступить следующим образом:
List<myclass> myObjects = new ArrayList<myclass>(m_class_table.values());
Collections.sort(myObjects, new Comparator<myclass>() {
@Override
public int compare(myclass o1, myclass o2) {
o1.stringField.compareTo(o2.stringField);
}
});
а затем выполняет итерацию по myObjects
списку. (Элементы в List
упорядочены.)
Комментарии:
1. спасибо за ответы, которые я получил — я нашел это решение, и оно отлично работает! coderanch.com/t/478708/java/java/comparator-example-needed
Ответ №2:
Небольшое изменение ответа aioobe: я бы создал список записей карты и отсортировал этот список. Таким образом, у вас все еще есть доступ к полным записям карты.
Map<String, MyClass> map = new HashMap<String, MyClass>();
// add some entries
List<Entry<String,MyClass>> entryList =
new ArrayList<Entry<String,MyClass>>(map.entrySet());
Collections.sort(entryList, new Comparator<Entry<String,MyClass>>() {
public int compare(
Entry<String, MyClass> first, Entry<String, MyClass> second) {
return first.getValue().getFoo()
.compareTo(second.getValue().getFoo());
}
});
Комментарии:
1.спасибо за ответы, которые я получил — я нашел это решение, и оно отлично работает! coderanch.com/t/478708/java/java/comparator-example-needed