Vì Hàng đợi mở rộng Bộ sưu tập, bạn sẽ có thể lặp lại.
cho (Số nguyên iq: hàng đợi) arr [i ++] = iq;
Hmm, nếu @amit đúng là PriorityQueue đảm bảo lặp lại theo thứ tự, điều này sẽ không hoạt động.
Tuy nhiên, một Chỉnh sửa sau ...
Nhiều người trong chúng biết rằng PriorityQueue không lặp theo thứ tự. Đó là bởi vì PriorityQueue chỉ phân loại một phần các phần tử, nó chủ yếu theo dõi phần tử đầu (ít nhất).
Một đề xuất để giữ nguyên PriorityQueue là tạo bản sao và lấy/rút ra khỏi bản sao. Khác là tạo một List từ các nội dung (vì bạn biết kích thước chính xác, tôi nghĩ một ArrayList là thích hợp nhất) và sắp xếp một cách rõ ràng Danh sách.
Tôi đoán là Danh sách sẽ nhanh hơn. Chúng ta biết rằng nó là O (n log (n)). Bây giờ, các javadocs PriorityQueue nói rằng thêm và loại bỏ là O (log (n)). Và bạn sẽ gọi chúng là N lần, vì vậy, về mặt lý thuyết, PriorityQueue cũng là O (n log (n)). Tuy nhiên, nếu sử dụng PriorityQueue thực sự nhanh hơn một loại cho trường hợp sử dụng phổ biến này, lặp qua danh sách có thứ tự, tôi nghĩ tôi đã thấy nhiều bài viết "mẹo hiệu suất" cho biết "Sử dụng PriorityQueue thay vì Collections.sort(). " Mà tôi chưa có. Tôi đã bỏ lỡ chúng chưa?
Dù sao, OP có thể thử cả hai và báo cáo lại. Nó sẽ là, với tôi, một khám phá hấp dẫn và hữu ích nếu một PriorityQueue nhanh hơn việc phân loại một Danh sách.
Tôi đã thực hiện một số thử nghiệm trên 1 triệu số nguyên ngẫu nhiên. ArrayList được sắp xếp nhanh gấp 2 lần so với việc thoát khỏi PriorityQueue trên máy tính để bàn cũ 7 năm của tôi, JDK6. Mã sau.
public class StackOverflow2 {
ArrayList<Integer> generateRandomList(int count, int seed) {
ArrayList<Integer> list = new ArrayList<Integer>(count);
Random random = new Random();
random.setSeed(seed);
for (int i=0; i<count; i++)
list.add(Integer.valueOf(random.nextInt()));
return list;
}
long usePriorityQueue(ArrayList<Integer> inList) {
long total = 0;
long start = System.currentTimeMillis();
PriorityQueue<Integer> pq = new PriorityQueue<Integer>(inList);
while (!pq.isEmpty()) {
total += pq.remove(); // do something so HotSpot doesn't optimize this away...
}
long totaltime = System.currentTimeMillis() - start;
System.out.println("usePriorityQueue totaltime = " + totaltime);
return total;
}
long useArrayList(ArrayList<Integer> inList) {
long total = 0;
long start = System.currentTimeMillis();
ArrayList<Integer> list = new ArrayList<Integer>(inList);
Collections.sort(list);
for (Integer iii : list) {
total += iii; // do something
}
long totaltime = System.currentTimeMillis() - start;
System.out.println("useArrayList totaltime = " + totaltime);
return total;
}
public static void main(String[] args) {
StackOverflow2 so2 = new StackOverflow2();
ArrayList<Integer> randoms = so2.generateRandomList(1000000, 123456);
for (int i=0; i<10; i++) {
long upq = so2.usePriorityQueue(randoms);
long ual = so2.useArrayList(randoms);
}
}
}
Bạn nên xác định 'phương pháp tiếp cận tốt hơn'. nhanh hơn? thanh lịch hơn? mã ngắn hơn? nhiều không gian hiệu quả hơn? ...? – amit
@amit: Có, tất cả những gì bạn nói, nếu bạn có thể cung cấp bất kỳ thứ gì trong số họ. Tất nhiên, tôi sẽ chọn câu trả lời tốt nhất. :) –