在java中创建点(x,y)的HashMap和ArrayList<Integer>

问题描述 投票:0回答:1

我必须制作一个点和数组列表的 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 class object hashmap std-pair
1个回答
0
投票

在 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.");
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.