gpt4 book ai didi

java - ArrayLists 值在 Get() 调用时返回 Null 的 HashMap

转载 作者:太空宇宙 更新时间:2023-11-04 15:19:49 26 4
gpt4 key购买 nike

我有一个 HashMap,它存储我作为键创建的对象,并映射到类似对象的 ArrayList

但是,我正在调用 get 方法,并且使用 jGrasp 的调试器,我可以清楚地看到我在 get() 中使用的 key 存在,并且确实映射到 array 但我能得到的唯一值是 null 值。

这是我获取null值的地方。

public List<Entry> query(Record query) {
List<Entry> candList;
Entry key = new Entry(makeKey(query));

candList = map.get(key);

return candList;
}

这里是我从主存储填充 HashMap 的地方。

for(int i = 0; i < main.size(); i++) {
if(main.get(i).isActive()) {
values.clear();
tmp = new Entry(main.get(i).record());
key = new Entry(Record.make(tmp.entity(),tmp.relation(),wild));

if(!map.containsKey(key)) {
for(int v = 0; v < main.size(); v++) {
value = main.get(v);

if(key.entity().equals(value.entity()) && key.relation().equals(value.relation())) {
values.add(value);
}
}

map.put(key,new ArrayList(values));
}
}
}

Entry 是一个包装类,此处默认为其内部对象的 equals() 方法。

public boolean equals(Object o){
if(o == null){
return false;
}
else if(o instanceof Record){
Record r = (Record) o;
return this.entity.equals(r.entity) && this.relation.equals(r.relation) && this.property.equals(r.property);
}

else return false;
}

我还为此处的对象编写了哈希码。

int h = 0;
public int hashCode() {

int hash = h;

if(h != 0)
return hash;

String len = entity.concat(relation.concat(property));
for(int i = 0; i < len.length(); i++)
hash = hash * 31 +(int)len.charAt(i);

return hash;
}

需要澄清一下,Entry 对象保存一个 Record 类型的对象,其中包含三个不可变的 String,因此 >hashCode方程来自。

为了进一步澄清,有人要求查看整个 Entry 类。

private static class Entry {
private static boolean active;
private Record rec;

public Entry(Record r){
this.rec = r;
this.active = true;
}

public String entity() {
return rec.entity;
}

public String relation() {
return rec.relation;
}

public String property() {
return rec.property;
}

public Record record(){
return this.rec;
}

public boolean isActive(){
return this.active;
}

public void deactivate(){
this.active = false;
}

public void activate(){
this.active = true;
}

public boolean equals(Entry e) {
return this.rec.equals(e.record());
}

public int hashCode() {
return this.rec.hashCode();
}

public String toString() {
return rec.toString();
}
}

我的 HashMap 中发生了一些冲突,但我知道这不应该是一个太大的问题。有什么想法吗?

最佳答案

    public boolean equals(Object o){
if(o == null){
return false;
}
else if(o instanceof Record){
Record r = (Record) o;
return this.entity.equals(r.entity) && this.relation.equals(r.relation) && this.property.equals(r.property);
}

else return false;
}

你的Entry equals方法可能有问题,关系的定义是什么?该关系必须覆盖 equals() 和 hashCode()

很高兴将所有代码放在这里,您的主要定义是什么?并且在您的代码中有很多地方可能包含空指针错误

关于java - ArrayLists 值在 Get() 调用时返回 Null 的 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20524579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com