2011-10-24 31 views
1

我有一个排序的TreeMap,我想删除除前10个元素以外的所有元素。什么是做到这一点的方法?我考虑从地图的末尾移除元素,而地图大小大于10,但我不知道如何去做。我可以转换成列表然后返回吗?修剪TreeMap到n个条目

感谢

+1

什么是“排序后的HashMap”? –

+0

@Laurence Gonsalves:我已经使用值比较器对值进行了排序。当我打印map.toString()时,我得到按值排序的值。我只想打印前十名。 – eggonlegs

+0

Gah ....它是一个TreeMap。按值排序的TreeMap。我在比较器工具中将它从HashMap转换为TreeMap。抱歉! :/感谢您发现我的滑落 – eggonlegs

回答

4

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

+2

+1:另一种选择是使用TreeMap()和Comparator,如果排序需要的不是按键的自然排序。但如果通过“前10个元素”,OP意味着前10个插入对,那么LinkedHashMap是去这里的路。 – CoolBeans

+1

绝对好点。 –

+0

是的@CoolBeans,就是我所做的。 – eggonlegs

2

这是一个想法。也许做出的大小限制到10种元素的地图类,以及复制/构建你有限的映射片段这样:由多个认沽增加100元,以有限的尺寸图,一旦

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

} 

测试它( )调用,一旦使用构造:

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-> 104
5-> 105
6-> 106
7-> 107
8-> 108
9-> 109
10-> 110


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

我没有投资任何时间防御式编程,检查空,之类的事情。这里的想法是,我不知道或不在乎你原来的地图是什么。链接地图。树地图。定期地图。无论它返回的顺序如何,元素定义了“前10个元素”的含义,而我的地图类将只存储前10个元素,并在此之后忽略它。现在你有了你的前10名,无论这对你的地图意味着什么。

+0

谢谢 - 这很酷。不得不在mapreduce中修改一下,但结果非常棒。再次感谢 – eggonlegs