2017-08-03 135 views
-2

下面是一些代码,用于查看从左上角到右下角是否存在迷宫中的路径。我对这段代码的问题是我们检查failedPoints.contains(p):我们怎么能得到true为什么具有相同值的不同对象会导致HashSet.contains返回true?

在我们做之前if(failedPoints.contains(p))我们正在创建一个新的Point对象。即使新对象和col的值与另一个PointfailedPoints中具有相同的值,对象也会不同,因此不应该总是返回false

boolean getPath(boolean[][] maze, int row, int col, ArrayList<Point> path, HashSet<Point> failedPoints){ 
    /*if out of bounds or not available, return*/ 
    if(col<0 || row<0 || !maze[row][col]){ 
     return false; 
    } 
    Point p = new Point(row,col); 
    /* If we've already visited this cell return*/ 
    if(failedPoints.contains(p)){ 
     return false; 
    } 

    boolean isAtOrigin = (row == 0) && (col == 0); 

    /*If there's a path from start to my current location, add my location.*/ 
    if(isAtOrigin || getPath(maze,row,col -1, path, failedPoints) || getPath(maze,row-1, col, path,failedPoints)){ 
     path.add(p); 
     return true; 
    } 
    failedPoints.add(p); //Cache result 
    return false; 
} 
+0

你读过“包含”了吗?什么不清楚? – Tom

+0

.contains将检查对象是否包含在哈希集中。但是,如果我创建了一个新的对象,其值与哈希集中的另一个对象相同,即使对象不同,即使它们的属性可能相同,hashset.contains仍然会返回false – Matt

+0

那就是让我困惑的东西 – Matt

回答

2

这取决于Point类的定义。

看看the HashSet.contains Javadocs

公共布尔包含(对象o)

返回true,如果此set包含指定的元素。更正式地说,当且仅当这个集合包含一个使得(o == null?e == null:o.equals(e))的元素e时才返回true。

所以如果Point类定义equals方法,该方法检查是否它的行和列是相同的其他点的行和列(也限定了hashCode方法,该方法不破坏合同),那么failedPoints.contains()将返回true,如果另一个Point等于正在测试的那个存在于集合中。

+0

.equals将检查两个对象是否相同,如果它们共享相同的属性值 – Matt

+1

@Matt:['.equals'文档](https://docs.oracle.com/javase/8/docs/api/ java/lang/Object.html#equals-java.lang.Object-)不同意。这听起来像你正在考虑'==',这在一般情况下并不使用,因为它比较了对象身份而不是对象值。 –

相关问题