Tôi gặp sự cố khi viết phương thức hashCode()
cho lớp tôi đã tạo. Lớp này có nghĩa là được sử dụng bên trong một TreeSet, và như vậy, nó thực hiện Comparable. Lớp học có các biến sau:Tạo phương thức hashCode() - Java
public class Node implements Comparable<Node> {
Matrix matrix;
int[] coordinates= new int[2];
Node father;
int depth;
int cost;
Đây là cách triển khai phương pháp compareTo()
. Tôi muốn các TreeSet
để tổ chức các cấu trúc nút bằng chi phí của họ, do đó, compareTo()
trả về kết quả của phép trừ đơn giản.
public int compareTo(Node nodeToCompare) {
return this.cost - nodeToCompare.cost;
}
Tôi cũng đã triển khai phương thức equals()
.
public boolean equals(Object objectToCompare) {
if(objectToCompare== this) {return true;}
if(objectToCompare== null || objectToCompare.getClass()!= this.getClass()) {return false;}
Node objectNode= (Node) objectToCompare;
return this.father.equals(objectNode.father) &&
this.depth== objectNode.depth &&
this.cost== objectNode.cost &&
this.matrix.equals(objectNode.matrix) &&
Arrays.equals(this.coordinates, objectNode.coordinates);
}
Có nói tất cả điều đó, tôi có một vài câu hỏi:
- Kể từ khi tôi thực hiện một phương pháp mới
equals()
, tôi nên thực hiện một phương pháp mớihashCode()
? - Tôi làm cách nào để có thể triển khai mã băm mới
method()
với các biến đó? (Lưu ý rằng ma trận biến của loại Ma trận có phương pháphashCode()
được triển khai)
Đó là tất cả!
Nhưng nếu tôi thay đổi phương thức compareTo, điều đó sẽ không thay đổi cách mọi thứ được sắp xếp trong một TreeSet? –
@ GonçaloLourenço: Có. Đó là quan điểm của tôi; ngay bây giờ, nếu 'n1.cost == n2.cost', thì' TreeSet' chứa 'n1' không thể chứa' n2'. Đó có thực sự là điều bạn muốn không? – ruakh
Chắc chắn là không. Đoán tôi sẽ phải sử dụng cái gì khác thay vì TreeSet. Vì bạn là người đầu tiên trả lời câu hỏi của tôi, tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời đúng. Cảm ơn vì sự giúp đỡ! –