将TreeMap修剪为n个条目

时间:2011-10-24 02:55:24

标签: java hashmap

我有一个已排序的TreeMap,我想删除除前10个元素之外的所有元素。有什么方法可以做到这一点?我考虑过在地图大小超过10的情况下从地图末尾删除元素,但我不知道该怎么做。我可以转换为List然后回来吗?

由于

2 个答案:

答案 0 :(得分:4)

HashMap没有开始或结束 - 它们是无序的。迭代项目的顺序与插入项目的顺序完全无关。如果您可以使用LinkedHashMap,那么该类实际上会保留项目的插入顺序。然后,您可以简单地遍历entrySet(),在迭代前十后,在每个项目的迭代器上调用remove()

答案 1 :(得分:2)

这是一个想法。也许制作一个大小限制为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→101
2→102
3→103
4-&GT; 104
5→105
6-&GT; 106
7-&GT; 107
8-&GT; 108
9-&GT; 109
10→110


1→201
2→202
3→203
4-&GT; 204
5→205
6-&GT; 206
7-&GT; 207
8-&GT; 208
9-&GT; 209
10→210

我没有投入任何时间进行防御性编程,检查空值,这类事情。这里的想法是我不知道或不关心你的原始地图是什么。链接地图。树地图。常规地图。无论它返回什么顺序,元素都定义了“前10个元素”的含义,而我的地图类只存储前10个,并忽略之后的任何元素。现在你有了前10个,这对你的地图意味着什么。