2010-09-14 29 views
14

Việc triển khai Hàng đợi Mức ưu tiên trong thư viện chuẩn Java dường như là một Hàng đợi Mức ưu tiên tối thiểu mà tôi thấy hơi khó hiểu. Để biến nó thành giá trị tối đa, tôi đã tạo đối tượng so sánh tùy chỉnh.Thay đổi Ưu tiên JavaQueue thành Max PQ

Comparator<Integer> cmp = new Comparator<Integer>() 
{ 
    public int compare(Integer x, Integer y) 
    { 
     return y - x; 
    } 
}; 

Tôi đã tự hỏi nếu có một giải pháp thanh lịch hơn. Về cơ bản, tôi không phải là hàng đợi ưu tiên chung có thể được sử dụng để thực hiện Dijkstras vv. Tôi thậm chí không nhận ra rằng sẽ có hàng đợi hoạt động ngược lại:/

Trả lời

13

Sử dụng bộ so sánh Collections.reverseOrder() của Java.

Java Reference

0

Nếu bạn có một trình so sánh hiện tại, bạn có thể tạo một đảo ngược chung so sánh.

public class InverseComparator<T> implements Comparator<T> { 
    private final Comparator<T> delegate; 

    public InverseComparator(Comparator<T> delegate) { 
     this.delegate = delegate; 
    } 

    public int compare(T x, T y) { 
     return delegate(y, x); 
    } 
} 
3

Không chắc chắn những gì bạn có nghĩa là bằng cách thanh lịch nhưng khi tôi muốn có một PQ thực hiện như một MaxHeap (sử dụng trong Dijkstra) tôi chỉ sử dụng một constructor so sánh inline.

PriorityQueue<Integer> PQ= new PriorityQueue<Integer>(20, new Comparator<Integer>(){ 
      public int compare(Integer o1, Integer o2){ 
       return o2 - o1; 
      } 
     }); 

Đủ đơn giản cho bất kỳ lúc nào tôi tìm kiếm một thứ gì đó đơn giản và chỉ muốn sử dụng Trình so sánh một lần.

18

Dưới đây là một đoạn mã sử dụng Collections.reverseOrder() -

PriorityQueue<Integer> maxPQ = new PriorityQueue<Integer>(20,Collections.reverseOrder()); 

Bạn cũng cần cung cấp công suất ban đầu của Queue ưu tiên (20 đây) cùng với sánh.

+3

Java 8 thêm một hàm tạo chỉ cần một Trình so sánh (https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html), vì vậy nếu bạn đang sử dụng Java 8 bạn không phải cung cấp dung lượng ban đầu. – tsleyson

Các vấn đề liên quan