【问题标题】:Remove value from List of Map in java从 java 中的 Map 列表中删除值
【发布时间】:2012-09-25 13:15:02
【问题描述】:

从包含映射的java列表中删除值

我有这种形式的列表:

List: [{id=1,c_id=3,value=5},{id=1,c_id=2,value=5},{id=1,c_id=3,value=5},{id=2,c_id=1,value=5},       
        {id=2,c_id=null,value=5}}];

结果我想得到

List: [{id=1,c_id=3,value=5},,{id=1,c_id=2,value=5},{id=2,c_id=1,value=5}}]

对于相同的id,如果c_id 相同,则应将其删除,如果c_idnull 相同,则应将其删除。

【问题讨论】:

  • 是调试器的输出。
  • 我假设你不想要,,
  • 为什么它删除了第二个c_id=3而不是第一个?

标签: java list map


【解决方案1】:

你可以的

for(Iterator<Map<String, Object>> iter = list.iterator(); iter.hasNext(); ) {
    Map<String, Object> map = iter.next();
    Object c_id = map.get("c_id");
    if (c_id == null || c_id.equals(matching_c_id))
        iter.remove();
}

【讨论】:

    【解决方案2】:

    Guava solution:

    Iterables.removeIf(list, new Predicate<Element>(){
        @Override public boolean apply(Element e) {
            return e.c_id == null || e.c_id.equals(matching_c_id);
    }});
    

    【讨论】:

    • 您也可以添加 Java 8 版本(如 here 所述)。
    【解决方案3】:

    我认为一个解决方案可能是以下一个,我认为它是可读的。

    首先,为您的对象类型构造一个集合元素代理:

    public class MyTypeProxy {
    
         private MyType obj;
    
         public MyTypeProxy(MyType obj) {
    
             this.obj = obj;
    
         }
    
         public MyType getObj() { return this.obj; }
    
         public int hashcode() {
    
             return obj.getC_id() ^ obj.getId();
    
         }
    
         public boolean equals(Object ref) {
    
             if (ref.getClass() != MyTypeProxy.class) {
                 return false;
             }
             return 
                  ((MyTypeProxy)ref).obj.getC_id() == this.obj.getC_id() &&
                  ((MyTypeProxy)ref).obj.getId() == this.obj.getC_id();
         }
    }
    

    然后,在您的代码中,您可以构造一个 HashSet。

    HashSet<MyTypeProxy> set = new HashSet<MyTypeProxy>();
    
    for (MyType mt : list) {
        if (mt.getC_id() != null){
            set.add(new MyTypeProxy(myList));
        }
    }
    

    下面做了两件事。首先,它排除具有空 c_id 字段的对象,其次,它过滤掉具有相同 id 和 c_id 组合的对象。您可能要考虑保留第一个是否可以(上面的代码就是这样做的)。

    该套装现在包含您所需要的。

    【讨论】:

      猜你喜欢
      • 2020-03-31
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2016-02-17
      • 2016-03-07
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多