Java 删除具有空值的树映射项
我试图删除所有的空值,但是如果最后一个键的树集为空,那么它仍然存在。所以我在想,如果最后一个条目为空,如何删除它。由于这是一个树状图,我认为我可以通过使用tm.lastKey()访问最后一个元素来获得它,但该方法似乎不存在。所以这个问题是双重的。首先,有没有办法删除所有空值,包括最后一个空值,第二个空值是.lastKey()方法的位置Java 删除具有空值的树映射项,java,dictionary,treemap,Java,Dictionary,Treemap,我试图删除所有的空值,但是如果最后一个键的树集为空,那么它仍然存在。所以我在想,如果最后一个条目为空,如何删除它。由于这是一个树状图,我认为我可以通过使用tm.lastKey()访问最后一个元素来获得它,但该方法似乎不存在。所以这个问题是双重的。首先,有没有办法删除所有空值,包括最后一个空值,第二个空值是.lastKey()方法的位置 公共类计时{ 私有静态映射tm=newtreemap(); 公共静态映射操作(){ SortedSet ss=新树集(); ss.添加(“应用”); ss.添加(
公共类计时{
私有静态映射tm=newtreemap();
公共静态映射操作(){
SortedSet ss=新树集();
ss.添加(“应用”);
ss.添加(“VOD”);
ss.添加(“MSFT”);
tm.put(“2019-09-18”,无效);
tm.put(“2019-09-21”,ss);
tm.put(“2019-09-22”,无效);
tm.put(“2019-09-20”,ss);
tm.put(“2019-09-19”,无效);
tm.put(“2019-09-23”,无效);
返回tm;
}
公共静态void printMap(){
对于(字符串s:tm.keySet()){
System.out.println(s+“:”+tm.get(s));
}
}
//将删除除最后一个之外的所有内容
公共静态void deleteNull(){
Set=tm.entrySet();
迭代器i=set.Iterator();
Map.Entry me=(Map.Entry)i.next();
//没有tm.lastKey()??
while(i.hasNext()){
if(me.getValue()==null){
i、 删除();
}
me=(Map.Entry)i.next();
}
}
}
JavaTreeMap
确实指定了lastKey()
方法。您可以在forTreeMap
中看到它
问题是,您无法访问该方法,因为您正在将映射的真实类型隐藏到方法中。你可以在这里看到:
private static Map<String, SortedSet> tm = new TreeMap<String, SortedSet>();
备选案文2:
public String lastKey() {
if (tm instanceof TreeMap<?, ?>) {
return ((TreeMap<String, SortedSet>) tm).lastKey();
} else {
// Error!
}
}
公共字符串lastKey(){
if(树映射的tm实例){
return((TreeMap)tm).lastKey();
}否则{
//错误!
}
}
要从地图中删除所有值为null
的条目,可以将deleteNull
方法替换为
tm.values().removeIf(Objects::isNull);
最简单的方法是在while循环结束后再次运行check迭代器,如下所示:
while(i.hasNext()) {
if (me.getValue() == null) {
i.remove();
}
me = (Map.Entry) i.next();
}
if (me.getValue() == null) {
i.remove();
}
me = (Map.Entry) i.next();
这样,您将捕获最后一个值
但是,可以使用与打印地图类似的关键点集
Set<String> keySet = tm.keySet();
for(int ndx = 0; ndx < keySet.size(); ndx++){
String key = keySet.get(ndx);
if(tm.get(key) == null){
tm.remove(key);
}
}
Set keySet=tm.keySet();
对于(int ndx=0;ndx
不要使用原始类型。您的tm
是一个Map
。当然,TreeMap
的方法在它上面是不可见的。在删除一些条目后,集合的大小不会改变吗?所以我们要么得到multhithread异常,要么得到indexout of bounds?很好的尝试,但最简单的方法是我认为Modus的答案:)确实非常优雅
while(i.hasNext()) {
if (me.getValue() == null) {
i.remove();
}
me = (Map.Entry) i.next();
}
if (me.getValue() == null) {
i.remove();
}
me = (Map.Entry) i.next();
Set<String> keySet = tm.keySet();
for(int ndx = 0; ndx < keySet.size(); ndx++){
String key = keySet.get(ndx);
if(tm.get(key) == null){
tm.remove(key);
}
}