Java HashTable: Какой самый элегантный способ клонировать хэш-таблицу на определенном интервале в обратном порядке?

#java #hashtable

#java #хэш-таблица

Вопрос:

Каков наиболее элегантный способ копирования ключей и значений из одной хэш-таблицы в другую между начальным и конечным ключами в обратном порядке? Например, исходная хеш-таблица:

 [<1,"object1">; <2, "object2">; <4,"object3">; <5,"object4">;<7,"object5">;<8,"object6">]
  

после вызова функции getPartListOfNews(2,4) она должна возвращать хэш-таблицу следующим образом:

 [<7,"object5">;<5,"object4">;<4,"object3">]
  

Я создал код для этого, и он приведен ниже, но я не думаю, что это лучший способ сделать то, что я описал ранее. Есть ли ara какие-либо лучшие решения? Как я могу упростить этот код?

 public Hashtable<Integer, News> getPartListOfNews(int start, int end){
        Hashtable <Integer, News> tempNewsList = new Hashtable <Integer, News>();
        int total_to_get = end-start;
        int list_size = newsList.size();
        Object[] key_array = new Object[list_size];
        if(list_size < total_to_get){
            return newsList;
        }
        else{
            Enumeration e = newsList.keys();
            int index=0;
            while(e.hasMoreElements()){
                key_array[index] = e.nextElement();
                index  ;
            }
            for (int i=end; i>start; i--){
                tempNewsList.put((Integer)key_array[i], newsList.get(key_array[i]));
            }
            return tempNewsList;
        }
    }
  

Обновить:

 public Hashtable<Integer, News> newsList = new Hashtable<Integer, News>();
  

Спасибо.

Комментарии:

1. Почему вам нужно клонировать хэш-таблицу в обратном порядке?

2. Я создаю программу чтения новостей rss для Android, и это серверный код. Хэш-таблица — это кэшированные новости. Из-за большого количества новостей я хочу передавать на Android только новости между определенным интервалом, а список новостей должен начинаться с самых последних новостей

3. Вам никто не говорил, что хэш-таблицы не упорядочены по ключу?

4. зачем вам нужны целые числа? поместите ее в общий список (например, ArrayList) и вызовите для нее подсписок (a, b)

5. Хэш-таблицы были в проекте раньше. Изменение хэш-таблиц на ArrayList займет некоторое время, и я не уверен, что все будет хорошо работать с ArrayLists

Ответ №1:

Во-первых, вам нужно использовать LinkedHashMap в вашем newsList атрибуте, чтобы сохранить порядок вставки. Кроме того, лучше, если вы объявляете атрибуты и возвращаете значения методов, используя Map интерфейс вместо используемого конкретного класса, таким образом, вы можете легко изменить реализацию, например, так:

 private Map<Integer, News> newsList = new LinkedHashMap<Integer, News>();
  

Имея в виду вышесказанное, вот мой способ решения вашей проблемы:

 public Map<Integer, News> getPartListOfNews(int start, int end) {

    // first, get the range of keys from the original map

    List<Integer> keys = new ArrayList<Integer>();
    for (Integer key : newsList.keySet()) // iterates in insertion order
        keys.add(key);
    List<Integer> subkeys = keys.subList(start, end);

    // now add them in the required order

    Map<Integer, News> tempNewsList = new LinkedHashMap<Integer, News>();
    ListIterator<Integer> iter = subkeys.listIterator();
    while (iter.hasPrevious()) {
        Integer key = iter.previous();
        tempNewsList.put(key, newsList.get(key));
    }

    return tempNewsList;

}
  

Ответ №2:

Во-первых, ваш код не имеет никакого эффекта. Хэш-таблица «нарушает» порядок. Порядок элементов в хэш-таблице зависит от конкретной реализации хэша.

В JDK есть 2 типа карт: HashMap и SortedMap (обычно мы используем его реализацию TreeMap). Кстати, не используйте хэш-таблицу: это старая, синхронизированная и почти устаревшая реализация).

Когда вы используете HashMap (и Hashtable), порядок ключей непредсказуем: это зависит от реализации hashCode() метода класса, который вы используете в качестве ключей вашей карты. Если вы используете TreeMap, вы можете использовать Comparator для изменения этой логики.

Если вы хотите, чтобы ваши ключи извлекались в том же порядке, в котором вы их используете LinkedHashMap .

Ответ №3:

Я думаю, что хэш-таблица не упорядочена. Если вы используете упорядоченную структуру данных (такую как LinkedHashMap), вы можете отсортировать ее (с помощью встроенных методов Java) и создать подсписок. это должно быть 2 строки кода и очень эффективно.