java сортирует хэш-таблицу со значением объекта по параметру objecs string

#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