我有一个已排序的TreeMap,我想删除除前10个元素之外的所有元素。有什么方法可以做到这一点?我考虑过在地图大小超过10的情况下从地图末尾删除元素,但我不知道该怎么做。我可以转换为List然后回来吗?
由于
答案 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个,这对你的地图意味着什么。