2011-10-24 64 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