Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-从HashMap检索对象_Java_Hashmap - Fatal编程技术网

Java-从HashMap检索对象

Java-从HashMap检索对象,java,hashmap,Java,Hashmap,从hashmap检索值时出现问题。hashmap声明如下: HashMap<TRpair,A> aTable = new HashMap<TRpair,A>(); aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai()); int i = 0; for (Map.Entry<TRpair,A> entry : aTable.entrySet()) {

从hashmap检索值时出现问题。hashmap声明如下:

HashMap<TRpair,A> aTable = new HashMap<TRpair,A>();
aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai());
int i = 0;
for (Map.Entry<TRpair,A> entry : aTable.entrySet()) {
    System.out.println(entry.getKey().toString() + " " + entry.getValue().toString());
    System.out.println(entry.getKey().equals(new TRpair(new T("!"),new Integer(10))));
    i++;
}
public class TRpair {
    private final T t;
    private final Integer r;

    protected TRpair(Integer r1, T t1) {
        terminal = t1;
        row = r1;
    }

    protected TRpair(T t1, Integer r1) {
        t = t1;
        r = r1;
    }

    @Override
    public boolean equals(Object o) {
        TRpair p = (TRpair)o;
        return (p.t.equals(t)) && (p.r.equals(r));
    }

    @Override
    public String toString() {
        StringBuilder sbldr = new StringBuilder();
        sbldr.append("(");
        sbldr.append(t.toString());
        sbldr.append(",");
        sbldr.append(r.toString());
        sbldr.append(")");
        return sbldr.toString();
    }
}
尽管上面的代码片段确认映射中确实有一个条目正好使用此键,但输出为null

如果有帮助,类TRpair声明如下:

HashMap<TRpair,A> aTable = new HashMap<TRpair,A>();
aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai());
int i = 0;
for (Map.Entry<TRpair,A> entry : aTable.entrySet()) {
    System.out.println(entry.getKey().toString() + " " + entry.getValue().toString());
    System.out.println(entry.getKey().equals(new TRpair(new T("!"),new Integer(10))));
    i++;
}
public class TRpair {
    private final T t;
    private final Integer r;

    protected TRpair(Integer r1, T t1) {
        terminal = t1;
        row = r1;
    }

    protected TRpair(T t1, Integer r1) {
        t = t1;
        r = r1;
    }

    @Override
    public boolean equals(Object o) {
        TRpair p = (TRpair)o;
        return (p.t.equals(t)) && (p.r.equals(r));
    }

    @Override
    public String toString() {
        StringBuilder sbldr = new StringBuilder();
        sbldr.append("(");
        sbldr.append(t.toString());
        sbldr.append(",");
        sbldr.append(r.toString());
        sbldr.append(")");
        return sbldr.toString();
    }
}
每个Ai(扩展A)和T类中的equals()和toString()方法都会被类似地重写,并表现出预期的行为

为什么hashmap的值输出为空,而之前已经确认对应键的值确实在映射中

非常感谢,


Froskoy。

哈希集合的键/元素,但如果重写了euqals,则重写hashCode()

你可以用

public int hashCode() {
    return t.hashCode() * 31 ^ r.hashCode();
}
顺便说一句:从代码中可以看出,
Integer r
不能为
null
,在这种情况下,使用
int r
更有意义

请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码


哈希集合的键/元素,但如果重写了euqals,则重写hashCode()

你可以用

public int hashCode() {
    return t.hashCode() * 31 ^ r.hashCode();
}
顺便说一句:从代码中可以看出,
Integer r
不能为
null
,在这种情况下,使用
int r
更有意义

请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码


IIRC hashmap是通过
hashCode()
而不是通过相等来查找的,因为您没有实现hashCode,所以使用与对象指针相等一致的默认实现- 您需要实现适当的hashcode函数,该函数考虑了“T”参数和整数(或不考虑)


hashCode()和equals()是一致的,这是一个很好的实践,但如果您知道自己在做什么,则在结构上不需要

IIRC hashmap按
hashCode()
查找,而不是按相等进行查找,并且由于您没有实现hashCode,因此使用与对象指针相等一致的默认实现- 您需要实现适当的hashcode函数,该函数考虑了“T”参数和整数(或不考虑)


hashCode()和equals()是一致的,这是一个很好的实践,但如果您知道自己在做什么,则在结构上不需要

您需要重写
TRpair
中的
hashCode()
方法,否?为什么?覆盖equals()还不够吗?
hashCode()
如果有更多对象具有相等的值(和状态),则需要覆盖以保持相等。更多可哈希表通过哈希检查一致性和相等性。您需要重写
TRpair
中的
hashCode()
方法,否?为什么?覆盖equals()还不够吗?
hashCode()
如果有更多对象具有相等的值(和状态),则需要覆盖以保持相等。更多可哈希表通过哈希检查一致性和相等性。谢谢!选择31仅仅是因为它是一个任意素数,还是有其他原因?它是一个有点任意但常用的素数。e、 g.String.hashCode()使用它。@Froskoy,你可以使用你选择的任何素数。再次感谢!还有,我应该在t.hashCode()和r.hashCode()中放些什么?这些东西对于t/r来说是唯一的吗?@Froskoy你可以使用任何非平凡的素数。我不会用2谢谢选择31仅仅是因为它是一个任意素数,还是有其他原因?它是一个有点任意但常用的素数。e、 g.String.hashCode()使用它。@Froskoy,你可以使用你选择的任何素数。再次感谢!还有,我应该在t.hashCode()和r.hashCode()中放些什么?这些东西对于t/r来说是唯一的吗?@Froskoy你可以使用任何非平凡的素数。我不会用2