我有一個排序的TreeMap,我想刪除除前10個元素以外的所有元素。什麼是做到這一點的方法?我考慮從地圖的末尾移除元素,而地圖大小大於10,但我不知道如何去做。我可以轉換成列表然後返回嗎?修剪TreeMap到n個條目
感謝
我有一個排序的TreeMap,我想刪除除前10個元素以外的所有元素。什麼是做到這一點的方法?我考慮從地圖的末尾移除元素,而地圖大小大於10,但我不知道如何去做。我可以轉換成列表然後返回嗎?修剪TreeMap到n個條目
感謝
HashMap
都不具備的一個開始或結束 - 他們是無序的。迭代項目的順序與插入項目的順序完全無關。如果您可以改爲使用LinkedHashMap,那麼該類實際上會保留插入項目的順序。然後,您可以簡單地遍歷entrySet()
,在您迭代前十個之後,爲每個項目在迭代器上調用remove()
。
這是一個想法。也許做出的大小限制到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名,無論這對你的地圖意味着什麼。
謝謝 - 這很酷。不得不在mapreduce中修改一下,但結果非常棒。再次感謝 – eggonlegs
什麼是「排序後的HashMap」? –
@Laurence Gonsalves:我已經使用值比較器對值進行了排序。當我打印map.toString()時,我得到按值排序的值。我只想打印前十名。 – eggonlegs
Gah ....它是一個TreeMap。按值排序的TreeMap。我在比較器工具中將它從HashMap轉換爲TreeMap。抱歉! :/感謝您發現我的滑落 – eggonlegs