Обрезка TreeMap для n записей - PullRequest
1 голос
/ 24 октября 2011

У меня есть отсортированный TreeMap, и я хочу удалить все, кроме первых 10 элементов.Какой способ сделать это?Я рассмотрел удаление элементов с конца карты, когда размер карты больше 10, но я не знаю, как это сделать.Могу ли я преобразовать в список, а затем обратно?

Спасибо

Ответы [ 2 ]

4 голосов
/ 24 октября 2011

HashMap s не имеют ни начала, ни конца - они неупорядочены.Порядок, в котором вы перебираете элементы, будет полностью не связан с порядком, в котором вы вставили элементы.Если вместо этого вы можете использовать LinkedHashMap, этот класс фактически сохраняет порядок, в котором элементы вставляются.Затем вы можете просто выполнить итерацию по entrySet(), вызывая remove() для итератора для каждого элемента после того, как вы выполнили итерацию по первым десяти.

2 голосов
/ 24 октября 2011

Вот мысль.Возможно, создайте класс карты, размер которого ограничен 10 элементами, и скопируйте / создайте свой ограниченный сегмент карты следующим образом:

package main;

import java.util.LinkedHashMap;
import java.util.Map;

import com.google.common.collect.Maps;

public class HashMap10<K, V> extends LinkedHashMap<K, V> {

    private static final long serialVersionUID = -4943383947326287590L;

    static Map<Integer, String> x = Maps.newHashMap();

    public HashMap10() {
        super();
    }

    public HashMap10(int initialCapacity, float loadFactor, boolean accessOrder) {
        super(initialCapacity, loadFactor, accessOrder);
    }

    public HashMap10(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
    }

    public HashMap10(int initialCapacity) {
        super(initialCapacity);
    }

    public HashMap10(Map<? extends K, ? extends V> m) {
        putAll(m);
    }

    @Override
    public V put(K key, V value) {
        if (this.size() == 10) {
            return null;
        }
        return super.put(key, value);
    }

    @Override
    public void putAll(Map<? extends K, ? extends V> m) {
        for (java.util.Map.Entry<? extends K, ? extends V> x : m.entrySet()) {
            put(x.getKey(), x.getValue());
        }
    }

}

Протестируйте его, добавив 100 элементов на карту ограниченного размера, один раз несколькимивызовы put () и один раз с помощью конструктора:

package main;

import java.util.HashMap;
import java.util.Map.Entry;

public class TestIt {

    /**
     * @param args
     */
    public static void main(String[] args) {
        HashMap10<Integer, String> map10 = new HashMap10<Integer, String>();

        for (int i = 1; i < 99; i++) {
            map10.put(i, Integer.toString(i + 100));
        }

        for (Entry<Integer, String> x : map10.entrySet()) {
            System.out.println(x.getKey() + "->" + x.getValue());
        }
        System.out.println("");
        System.out.println("");

        HashMap<Integer, String> mapUnlimited = new HashMap<Integer, String>();

        for (int i = 1; i < 99; i++) {
            mapUnlimited.put(i, Integer.toString(i + 200));
        }

        HashMap10<Integer, String> anotherMap10 = new HashMap10<Integer, String>(
                mapUnlimited);
        for (Entry<Integer, String> x : anotherMap10.entrySet()) {
            System.out.println(x.getKey() + "->" + x.getValue());
        }

    }

}

Дамп карт, и у вас есть только карты из 10 элементов, независимо от того, были ли вы добавлены элементы по одному или построили карту сконструктор:

1-> 1012-> 1023-> 1034-> 1045-> 1056-> 1067-> 1078-> 1089-> 10910-> 1101-> 2012-> 2023-> 2034-> 2045-> 2056-> 2067-> 2078-> 2089-> 20910-> 210

Я не тратил время на защитное программирование, проверку на нулевые значения и тому подобное.Идея в том, что я не знаю и не волнуюсь, какая у тебя оригинальная карта.Связанная карта.Древовидная карта.Обычная карта.Независимо от порядка, который он возвращает, элементы определяют, что вы подразумеваете под «первыми 10 элементами», и мой класс карты будет хранить только эти первые 10 и игнорировать любые последующие.Теперь у вас есть первые 10, что бы это ни значило для вашей карты.

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