![](/img/trans.png)
[英]In the HashMap of Java, will removing an element from keySet affect the hashmap object?
[英]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在另一個哈希映射(映射)內部則進行匹配)。
現在是提問時間
如何檢查是否包含(存在)或刪除對象(不是按索引而是按鍵)? 我該怎么做(上面的例子)。
您應該為類定義equals
和hashCode
方法。
否則,您將退回到檢查對象身份的默認實現,即,兩個引用是否指向相同的內存位置,而不是指向包含相同數據的兩個對象。
您遇到的第一個問題是Map使用鍵來檢索值。
Set<Object> set = new HashSet();
然后,當您使用Set或Map時,您的類必須覆蓋hashcode
和equals
方法。 如果不這樣做,則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());
}
}
}
希望這能解決您的問題。
首先,由於多種原因,您的代碼無法編譯。
您將類稱為Object
。 僅供參考java.lang.Object
是所有類的基類。 由於真實類Object
屬於包java.lang
,因此您不必導入它,因此它始終可用。 我不明白編譯器如何解決這種命名沖突。
接口Map
具有2個參數: K
表示鍵, V
表示值。 推薦線
public Map<Object> map = new HashMap<Object>();
無法編譯。 更改為
public Map<Object, Object> map = new HashMap<Object, Object>();
或者,最好使用實際參數代替Object
。
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.