#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 строки кода и очень эффективно.