Java从hashmap中删除对象

时间:2013-09-03 12:42:14

标签: java hashmap

public Map<Object> map = new HashMap<Object>();


map.add(new Object ("a", "b"));


public class Object {

    private String a;
    private String b;
    private String c;

    public Object(String a, String b) {
        this.a = a;
        this.a = b;
        this.c = "" + a + b + "";
    }

    public String getA() {
        return a;
    }

    public String getB() {
        return b;
    }

    public String getC() {
        return c;
    }   
}   

我有一个hashmap,基本上Object.getC()应该是字符串中的+ b。 在其他一些类中,我需要获取c值,如果该hashmap集合索引具有完全相同的c值,它将删除索引:

public static void deleteChest() {
    for (int i = 0; i < data.size(); i++) {
        if (data.get(i).getItems().length == 0) {
            Object c = new Object(data.get(i).getA(), data.get(i).getB());
            map.remove(c);
        }
    }
}

数据hashmap应该与map hashmap具有相同的索引号,所以如果你想知道它是什么。

基本上,我循环遍历所有数据hashmap项(获取A,B然后匹配,如果C在另一个hashmap(map)中)。

现在提问时间

如何检查对象是否包含(存在)或删除它(不是通过索引,而是通过键)?我该怎么做(上面的例子)。

6 个答案:

答案 0 :(得分:4)

您应该为您的班级定义equalshashCode方法。

否则,您将回退到检查对象标识的默认实现,即,如果两个引用指向同一内存位置,而不是指向包含相同数据的两个对象。

答案 1 :(得分:1)

您遇到的第一个问题是Map使用键来检索值。

Set<Object> set = new HashSet();

然后,当您使用Set或Map时,您的班级必须覆盖hashcodeequals方法。如果不这样做,Set将不知道如何正确地比较它们,以执行任何操作。

这就是为什么当你创建一个新的Object(a,b,c)时,它设置无法找到它们,因为它使用hashcode的默认值与类型成员无关。

答案 2 :(得分:1)

您必须将public Map<Object> map = new HashMap<Object>();字段更改为public Map<String,Foo> map = new HashMap<String,Foo>();,并且应将类的名称从Object更改为Foo,作为'mre'建议。

Foo Class

public class Foo {

    private String a;
    private String b;
    private String c;

    public Foo(String a, String b) {
        this.a = a;
        this.a = b;
        this.c = getKey();
    }

    public String getA() {
        return a;
    }

    public String getB() {
        return b;
    }

    public String getC() {
        return c;
    }   

    public String getKey() {
        return "" + a + b + "";
    }

    @Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((a == null) ? 0 : a.hashCode());
    result = prime * result + ((b == null) ? 0 : b.hashCode());
    result = prime * result + ((c == null) ? 0 : c.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Foo other = (Foo) obj;
    if (a == null) {
        if (other.a != null)
            return false;
    } else if (!a.equals(other.a))
        return false;
    if (b == null) {
        if (other.b != null)
            return false;
    } else if (!b.equals(other.b))
        return false;
    if (c == null) {
        if (other.c != null)
            return false;
    } else if (!c.equals(other.c))
        return false;
    return true;
}
}  

您可以在地图中添加对象,如下所示

map.put(new Foo("a", "b").getKey(),new Foo("a", "b"));

现在你的deleteChest()方法就像

public static void deleteChest() {
        Foo foo = null;  
        for (int i = 0; i < data.size(); i++) {
            foo =  map.get(new Foo(data.get(i).getA(), data.get(i).getB()).getKey())   
            if( foo != null) {
                map.remove(foo.getKey());
            }
        }
    }

希望这能解决你的问题。

答案 3 :(得分:0)

首先,由于多种原因,无法编译代码。

  1. 您致电您的班级Object。 FYI java.lang.Object是所有类的基类。由于真实Object属于包java.lang,因此您无需导入它,因此它始终可用。我不明白编译器如何解决这种命名冲突。

  2. 界面Map有两个参数:密钥为K,值为V。有线

  3. public Map<Object> map = new HashMap<Object>();

    无法编译。将其更改为

    public Map<Object, Object> map = new HashMap<Object, Object>();

    或者,更好地使用真实参数而不是Object

    1. Map接口有接受2个参数的方法。因此,以下行也无法编译。
    2. map.add(new Object ("a", "b"));

      如果您想使用与字符串使用代码组相关联的地图,请输入以下内容:

      Map<String, String> map = new HashMap<>();
      map.put("a", "b");
      

      按键使用删除值:

      map.remove("a");
      

      要检索值,请使用String v = map.get("a")

      要检索所有值,请使用map.keySet()map.entrySet()

答案 4 :(得分:0)

最适合我的解决方案是:

@Html.PartialFor(m => m.MainQuery, "_MainQuery")

答案 5 :(得分:-1)

试试这个

if(map.containsKey(key)){
            map.remove(map.get(key));
        }