簡體   English   中英

Java從哈希圖中刪除對象

[英]Java removing object from 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;
    }   
}   

我有一個哈希圖,基本上Object.getC()應該是字符串中的a + 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);
        }
    }
}

數據哈希圖應具有與地圖哈希圖相同的索引號,因此如果您想知道它是什么。

基本上,我遍歷所有數據哈希映射項(以獲取A,B,然后如果C在另一個哈希映射(映射)內部則進行匹配)。

現在是提問時間

如何檢查是否包含(存在)或刪除對象(不是按索引而是按鍵)? 我該怎么做(上面的例子)。

您應該為類定義equalshashCode方法。

否則,您將退回到檢查對象身份的默認實現,即,兩個引用是否指向相同的內存位置,而不是指向包含相同數據的兩個對象。

您遇到的第一個問題是Map使用鍵來檢索值。

Set<Object> set = new HashSet();

然后,當您使用Set或Map時,您的類必須覆蓋hashcodeequals方法。 如果不這樣做,則Set將不知道如何正確比較它們,以執行任何操作。

這就是為什么當您創建一個新的Object(a,b,c)時,它設置為找不到它們的原因,因為它使用的哈希碼的默認值與類型成員無關。

您應該必須更改public Map<Object> map = new HashMap<Object>(); 字段到public Map<String,Foo> map = new HashMap<String,Foo>(); 並且您應該將類​​的名稱從Object更改為Foo作為“ mre”建議。

富班

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());
            }
        }
    }

希望這能解決您的問題。

首先,由於多種原因,您的代碼無法編譯。

  1. 您將類稱為Object 僅供參考java.lang.Object是所有類的基類。 由於真實Object屬於包java.lang ,因此您不必導入它,因此它始終可用。 我不明白編譯器如何解決這種命名沖突。

  2. 接口Map具有2個參數: K表示鍵, V表示值。 推薦線

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

無法編譯。 更改為

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

或者,最好使用實際參數代替Object

  1. Map接口具有接受2個參數的put方法。 因此,以下行也無法編譯。

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()

對我有用的解決方案是:

map.remove("key");

嘗試這個

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM