Java ArrayList.contains()有时为真,有时为假

Java ArrayList.contains()有时为真,有时为假,java,arraylist,equals,hashcode,Java,Arraylist,Equals,Hashcode,我正在写一个模拟图形的简单程序。这就是我实现顶点的方式:(我用nodes这个词表示邻居,这可能有点让人困惑。) 在我的Graph类中,我编写了一个返回特定顶点的邻居(节点)的方法: public List<Vertex> getNodesOf(Vertex v) { List<Vertex> nodes = new ArrayList<>(); if (vertices.contains(v)) { //vertice

我正在写一个模拟图形的简单程序。这就是我实现顶点的方式:(我用nodes这个词表示邻居,这可能有点让人困惑。)

在我的Graph类中,我编写了一个返回特定顶点的邻居(节点)的方法:

public List<Vertex> getNodesOf(Vertex v) {
    List<Vertex> nodes = new ArrayList<>();
    if (vertices.contains(v)) {              //vertices is an ArrayList<Vertex>
        // adds all neighbours to nodes...
        return nodes;
    } else {
        Terminal.printLine("Error, " + v.getName() + " does not exist here!");
        return nodes;
公共列表getNodesOf(顶点v){
列表节点=新的ArrayList();
如果(顶点.contains(v)){//顶点是一个ArrayList
//将所有邻居添加到节点。。。
返回节点;
}否则{
printLine(“错误,+v.getName()+”在这里不存在!”);
返回节点;
当我从main方法调用该方法时,它运行良好:

List<Vertex> nodes = g.getNodesOf(new Vertex(input[1]));    //input[1] is a name typed by the user
        if (nodes != null) {
            for (Vertex node : nodes) {
                System.out.println(node.getName());
            }
        }
List nodes=g.getNodesOf(新顶点(输入[1]);//输入[1]是用户键入的名称
如果(节点!=null){
用于(顶点节点:节点){
System.out.println(node.getName());
}
}
但是我有另一个类用于dijkstra算法来寻找最短路径。该算法还需要邻居。这是代码的一部分:

    Vertex nearest = null;
    int distanceInt = 9999;
    for (Vertex vertex : unvisited) {
        if (distance.containsKey(vertex)) {
            if (distance.get(vertex) <= distanceInt) {
                nearest = vertex;
                distanceInt = distance.get(vertex);
            }
        }
    }

    if (graph.getNodesOf(nearest).contains(vertex)) {
        // do something...
    }
顶点最近值=null;
int距离int=9999;
用于(顶点:未访问){
if(距离。容器(顶点)){
如果(distance.get(vertex)您的equals()-hashCode()-实现被破坏。表示相等的对象必须具有相等的哈希代码。但是在equals()-方法中,您忽略名称的大小写,而哈希方法不忽略它

如果使用基于散列的映射,则此行为是相关的,
距离。containsKey(顶点)
看起来像一个典型的映射查找,因此我假设您的
距离
-对象是一种
映射


解决方案:使您的
hashCode()
-方法也不区分大小写,或者使您的
等于()
-方法区分大小写。

我在你的第三个代码块中看到了距离,但我没有看到它被声明。距离是每个顶点距离的哈希映射。这当然是正确的,
List
不使用
hashCode
,所以没关系…@boristader你的评论对列表是正确的,但我记住了映射-尤其是未记录的对象“距离”。谢谢你的帮助。你说得对。距离是每个顶点距离的哈希映射
    Vertex nearest = null;
    int distanceInt = 9999;
    for (Vertex vertex : unvisited) {
        if (distance.containsKey(vertex)) {
            if (distance.get(vertex) <= distanceInt) {
                nearest = vertex;
                distanceInt = distance.get(vertex);
            }
        }
    }

    if (graph.getNodesOf(nearest).contains(vertex)) {
        // do something...
    }