2017-09-06 108 views
1

是否有任何快速可靠的方法/方法根据条目值的属性删除一组条目。下面的方法循环每一个不合需要的条目。 e.g:ConcurrentHashMap的 - 参赛作品将在数以百万计删除地图中的一组条目的最佳方法

Iterator<Map.Entry<String, POJO>> iterator = map.entrySet().iterator(); 
    for (Iterator<Map.Entry<String, POJO>> it = iterator; it.hasNext();) { 
     Map.Entry<String, POJO> entry = it.next(); 
     POJO value = entry.getValue(); 
     if (value != null && *attribute*.equalsIgnoreCase(value.getAttribute())) { 
      it.remove(); 
     } 
    } 
+0

数据库使用_indexes_处理这些事情。因此,您可以使用另一个数据结构来跟踪具有某个特定属性的POJO标识符,或者使用不同的映射对数据按属性进行分区。但这样做容易使事情复杂化。您是否测量过并将其识别为应用程序中的瓶颈? –

回答

0

有没有利用额外的数据结构来代替突变地图的没有更好的办法。你基本上要求的是二级索引,就像在数据库中使用的那样,你可以根据一些非主键属性指向条目。如果你不想存储额外的索引,那么遍历所有条目没有更简单的方法。

我建议你看看是在你的原始地图组成地图视图。例如像(使用番石榴)

Map<String,POJO> smallerMap = Maps.filterValues(map, 
    v -> !attribute.equalsIgnoreCase(v.getAttribute()) 
); 

你需要小心这样的说法(不调用大小()就可以了,例如),但对访问等应该罚款(这取决于你的确切的需求,内存限制等)。

并附注 - 请注意我已删除空值检查。你不能在ConcurrentHashMap中存储空值 - 它在普通地图中也不是那么棒,更好的是移除整个密钥。

+1

感谢您的建议!地图中维护的数据用作另一个进程的源数据。所以数据应该被删除。 Map上的数据将存在多个添加,删除和更新请求。所以你建议的观点对这种情况没有帮助。 – user3629658

0

有两个解决方案,我能想到的

解决方案一:

创建另一个地图,用于存储对象的哈希码为重点和相应的密钥值。结构可能如下

Map<Integer, String> map2 = new HashMap<>(); 

这里是工作解决方案。只有这样做的缺点是,如果有大量的对象,那么获得唯一的哈希码可能会很困难。

import java.util.HashMap; 
import java.util.Map; 

public class DualHashMap { 

    public static void main(String a[]){ 

     Map<String, Pojo> map = new HashMap<>(); 
     Map<Integer, String> map2 = new HashMap<>(); 

     Pojo object1 = new Pojo(); 
     Pojo object2 = new Pojo(); 
     map.put("key1", object1); 
     map.put("key2", object2); 

     map2.put(object1.hashCode(), "key1"); 
     map2.put(object2.hashCode(), "key2"); 

     // Now let say you have to delete object1 you can do as follow 
     map.remove(map2.get(object1.hashCode())); 
    } 
} 


class Pojo{ 

    @Override 
    public int hashCode(){ 
     return super.hashCode(); //You must work on this yourself, and make sure hashcode is unique for each object 
    } 

} 

第二个解决方案: -

使用的番石榴或Apache

你需要Apache下议院类是BidiMap提供了双重的HashMap的解决方案。

这里是另一个你通过Guava

+0

1)为什么在这里涉及hashcode? OP希望getAttribute被索引,而不是哈希码。 2)你不能希望属性是唯一的 - 你需要使用像Multimap这样的东西,而不是双向地图。 3)不确定你想通过'return this.hashCode()'来显示什么,但是按照给定的方式,它会进入无限循环。也许你的意思是parent.hashCode()? (不是说它无论如何都有很大的意义) –

+0

我曾说过 - hascode可能是其中一种方式。我相信OP不会在其他地方使用散列码。只要看到哈希码方法的实现的评论,我已经在评论中清楚地写了它。如果用户维护POJO的id,那将是hashCode方法返回的最佳选择。 – nagendra547

相关问题