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)中)。
现在提问时间
如何检查对象是否包含(存在)或删除它(不是通过索引,而是通过键)?我该怎么做(上面的例子)。
答案 0 :(得分:4)
您应该为您的班级定义equals
和hashCode
方法。
否则,您将回退到检查对象标识的默认实现,即,如果两个引用指向同一内存位置,而不是指向包含相同数据的两个对象。
答案 1 :(得分:1)
您遇到的第一个问题是Map使用键来检索值。
Set<Object> set = new HashSet();
然后,当您使用Set或Map时,您的班级必须覆盖hashcode
和equals
方法。如果不这样做,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)
首先,由于多种原因,无法编译代码。
您致电您的班级Object
。 FYI java.lang.Object
是所有类的基类。由于真实类Object
属于包java.lang
,因此您无需导入它,因此它始终可用。我不明白编译器如何解决这种命名冲突。
界面Map
有两个参数:密钥为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()
。
答案 4 :(得分:0)
最适合我的解决方案是:
@Html.PartialFor(m => m.MainQuery, "_MainQuery")
答案 5 :(得分:-1)
试试这个
if(map.containsKey(key)){
map.remove(map.get(key));
}