我必须制作一个点和数组列表的 HashMap。点只不过是 x-y 平面中的 x 和 y 对。 然后我想存储所有学生的学号。在那个特定点有哪些。
因为我们在java中没有pair,所以为了一点,我创建了另一个名为pair的类,它有int x和int y两个变量,并且它有两个方法来访问x和y。以及一个初始化 x 和 y 的构造函数。 现在主要问题是:
当我想向哈希映射添加新点时,我创建一个pair类的新对象并推送卷号。 但问题是,我如何检查 HashMap 中是否已经存在任何点。 当我使用 map.containsKey() 时,我必须传递该对,但是我将如何传递该对,要传递对,我将创建另一个对象,当我将它传递给 containsKey() 函数时,它不会检测到已经存在的(x ,y) 对。并添加相同的 (x,y) 对作为 hashmap 中的新键。
在 Java 中使用自定义对象作为 HashMap 中的键时,您会遇到一个常见问题。问题在于,默认情况下,Java 的 Object 类在比较对象时使用引用相等,而不是结构相等。因此,即使您创建具有相同 x 和 y 值的新 Pair 对象,如果它具有不同的内存地址,也不会被视为等于 HashMap 中现有的 Pair 对象。
要解决这个问题,您需要重写 Pair 类中的 equals() 和 hashCode() 方法,以便它们根据 x 和 y 的值而不是对象的内存地址定义相等性。方法如下:
import java.util.*;
class Pair {
int x, y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
// Override equals() method to define equality based on values of x and y
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Pair pair = (Pair) o;
return x == pair.x && y == pair.y;
}
// Override hashCode() method to ensure consistency with equals()
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
public class Main {
public static void main(String[] args) {
HashMap<Pair, ArrayList<Integer>> map = new HashMap<>();
Pair point = new Pair(3, 4);
ArrayList<Integer> rollNumbers = new ArrayList<>();
rollNumbers.add(101);
map.put(point, rollNumbers);
// Check if point already exists
Pair newPoint = new Pair(3, 4);
if (map.containsKey(newPoint)) {
// Point already exists, update roll numbers or do something else
System.out.println("Point already exists in the map.");
} else {
// Point doesn't exist, add it to the map
ArrayList<Integer> newRollNumbers = new ArrayList<>();
newRollNumbers.add(102);
map.put(newPoint, newRollNumbers);
System.out.println("New point added to the map.");
}
}
}