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