Отображение объектов в Java

#java #mapping

#java #отображение

Вопрос:

Я хочу реализовать следующую идею в 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 amp;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 не являются одним и тем же объектом, но они имеют одинаковые значения элементов. Таким образом, они сопоставляются с одним и тем же логическим значением.

Я пытался использовать HashMap в Java для реализации этого, но безуспешно:

 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?

Ответ №1:

Для того, чтобы объект служил ключом в 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 amp;amp;
            y == a.y;
}

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

Комментарии:

1. Спасибо. Можете ли вы дать мне некоторое представление о том, что делать в случае массива?

2. Я имел в виду, как реализовать hashcode(). Я получил часть equals().

3. Хорошо, позвольте мне уточнить еще раз.

4. @AhsanTarique Если у вас есть другой вопрос, пожалуйста, откройте для него новое сообщение. Очень сложно следить за вопросами, представленными подобным образом в комментариях, без дополнительного контекста (или кода)

5. Извините @Mureinik. Я не уверен, что это другой вопрос. Это то, что я имел в виду: class A{ private int arr[]; ...} . Если вы считаете, что это следует задать в другом вопросе, пожалуйста, дайте мне знать.

Ответ №2:

Ваш класс A должен использовать метод equals and hashcode .

     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 resu<
    }


    @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");
        }
    }
}