2013-04-05 44 views
12

Tôi đang cố gắng viết một thuật toán sử dụng hàng đợi ưu tiên tối thiểu, vì vậy tôi đã xem xét trên google và tìm thấy PriorityQueue. Có vẻ như để sử dụng nó, mặc dù, tôi sẽ cần phải nói cho nó như thế nào tôi muốn nó để ưu tiên, và rằng cách để làm điều này là với một so sánh (tôi muốn so sánh các trường dữ liệu cụ thể của "Node1" của tôi các đối tượng). Nhiều googling đã trình bày ý tưởng tạo ra một trình so sánh mới thực hiện Comparator nhưng ghi đè phương thức so sánh. Những gì tôi đang cố gắng là thế này (và các biến thể khác của nó là tốt):Thực hiện so sánh Java

import java.util.Comparator; 

public class distComparator implements Comparator { 

    @Override 
    public int compare(Node1 x, Node1 y){ 
     if(x.dist<y.dist){ 
      return -1; 
     } 
     if(x.dist>y.dist){ 
      return 1; 
     } 
     return 0; 
    } 
} 

Các cuộc biểu tình biên dịch trên nhiều căn cứ, một trong số đó là tôi không có trên một thanh cuộn lớp so sánh (mà nó nói là trừu tượng)

error: distComparator is not abstract and does not override abstract method compare(Object,Object) in Comparator

Tôi đã chuyển sang chế độ "so sánh (đối tượng x, đối tượng y)", sẽ giải quyết vấn đề đó. Tại thời điểm này mặc dù trình biên dịch phàn nàn rằng nó không thể tìm thấy biến "dist" trong x hoặc y - điều này có ý nghĩa, vì chúng là một phần của lớp Node1 của tôi, không phải là lớp Object.

Vậy điều này có nghĩa là hoạt động như thế nào? Nó sẽ có loại Object, rõ ràng, nhưng sau đó làm thế nào để tôi chuyển nó đến biến đúng?

Trả lời

15

Bạn cần phải thực hiện Comparator<Node1>:

public class distComparator implements Comparator<Node1> { 
               ^^^^^^^ 

Nếu không có điều này, bạn đang thực hiện Comparator<Object>, mà không phải là những gì bạn muốn (nó có thể được thực hiện để làm việc, nhưng không phải là giá trị phức tạp).

Phần còn lại của mã trong câu hỏi của bạn là tốt, miễn là Node1 có thành viên có thể truy cập được gọi là dist.

Lưu ý rằng nếu bạn đang sử dụng Java 7, toàn bộ cơ thể của phương pháp này có thể được thay thế bằng

return Integer.compare(x.dist, y.dist); 

(thay thế Integer với Double vv, tùy thuộc vào loại Node1.dist.)

+0

Bạn cũng có thể viết 'trở lại x.dist - y.dist' – Polygnome

+1

@Polygnome: Tùy thuộc vào phạm vi tham gia này có thể hoặc có thể không làm việc cho các số nguyên, nhưng là một khởi động hoàn chỉnh cho các giá trị dấu phẩy động. – NPE

+0

Cảm ơn bạn! Giải quyết! –

2

Như bạn có thể xem here. Giao diện Comparator có chung mô tả loại so sánh này được thiết kế cho. Và thực sự là PriorityQueue.

Vì vậy, nếu bạn tạo một PriorityQueue<Node1>, bạn có thể tạo một Comparator<Node1>:

public class distComparator implements Comparator<Node1> {  
    @Override 
    public int compare(Node1 x, Node1 y){ 
     return x.dist - y.dist; 
    } 
} 
+2

sử dụng '<>' thay vì '[]' –