2017-08-03 136 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-)不同意。這聽起來像你正在考慮'==',這在一般情況下並不使用,因爲它比較了對象身份而不是對象值。 –

相關問題