我有一个排序的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