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

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

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

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

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

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

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>();

Спасибо.

Ответы [ 3 ]

1 голос
/ 16 октября 2011

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

1 голос
/ 16 октября 2011

Во-первых, вам нужно использовать 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;

}
1 голос
/ 16 октября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...