从包含地图
的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_id
为null
则应将其删除。
答案 0 :(得分:2)
你可以做到
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();
}
答案 1 :(得分:0)
我认为解决方案可能是以下一种,我认为它是可读的。
首先,为您的对象类型构建一个set element代理:
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组合的对象。你可能想要考虑保持第一个是否正确(这就是上面的代码所做的)。
该套装现在包含您所需要的内容。
答案 2 :(得分:0)
Iterables.removeIf(list, new Predicate<Element>(){
@Override public boolean apply(Element e) {
return e.c_id == null || e.c_id.equals(matching_c_id);
}});