用Java映射对象

时间:2016-10-20 05:11:29

标签: java mapping

我想在Java中实现以下想法:如果我将具有2个成员的类的一个对象映射到布尔值,并使用相同的2个成员值创建同一个类的另一个对象,则第二个对象应映射到与第一个布尔值相同的布尔值。

以下是C ++中的代码,希望能够解释我正在尝试做的事情:

#include <iostream>
#include <map>

using namespace std;


class A{
    int x;
    int y;

public:
    A(int a, int b){
        x = a;
        y = b;
    }
    bool operator < (const A &another) const{
        return x < another.x || y < another.y;
    }
};


int main() {

    A a(1,2),b(1,2);

    map <A,bool> exists;

    exists[a]=true;

    if(exists[b]){
        cout << "(1,2) exists" << endl;
    }
    else{
        cout << "(1,2) does not exist" << endl;
    }

    return 0;
}

输出:

  

(1,2)存在

这里a和b不是同一个对象,但它们具有相同的成员值。所以它们映射到相同的布尔值。

我尝试在Java中使用HashMap来实现这一点但没有成功:

import java.util.*;
import java.lang.*;
import java.io.*;

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        A a = new A(1,2);
        A b = new A(1,2);

        Map <A,Boolean> exists =  new HashMap<A,Boolean>();

        exists.put(a,true);
        if(exists.containsKey(b)){
            System.out.println("(1,2) exists");
        }
        else{
            System.out.println("(1,2) does not exist");
        }
    }
}

class A{
    private int x;
    private int y;

    public A(int a, int b){
        x = a;
        y = b;
    }
}

输出:

  

(1,2)不存在

我应该如何在Java中实现它?

2 个答案:

答案 0 :(得分:3)

要将对象作为HasMap中的关键字,您需要覆盖其equals(Object)hashCode()方法:

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    A a = (A) o;
    return x == a.x &&
            y == a.y;
}

@Override
public int hashCode() {
    return Objects.hash(x, y);
}

答案 1 :(得分:1)

您的班级A应该超越equalshashcode方法。

    public class A {
    private final int x;
    private final int y;

    public A(final int a, final int b) {
        this.x = a;
        this.y = b;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + x;
        result = prime * result + y;
        return result;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        A other = (A) obj;
        if (x != other.x)
            return false;
        if (y != other.y)
            return false;
        return true;
    }

}

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        A a = new A(1,2);
        A b = new A(1,2);

        Map <A,Boolean> exists =  new HashMap<A,Boolean>();

        exists.put(a,true);
        if(exists.containsKey(b)){
            System.out.println("(1,2) exists");
        }
        else{
            System.out.println("(1,2) does not exist");
        }
    }
}