簡體   English   中英

PriorityQueue更改poll()上的元素位置

[英]PriorityQueue changes elements positions on poll()

使用優先級隊列時出現一些問題。 不幸的是,我的Google研究沒有結果:(我希望有人可以幫助我。

我正在使用優先級隊列通過稱為“ reachabilityDistance”的特定屬性對某些對象進行排序,該屬性是一個簡單的double值。 將對象插入隊列可以正常工作,並導致正確的排序。 但是,然后我想輪詢隊列的第一個對象,並且其他對象的順序也會更改,即使它們的值保持不變。 怎么了

private PriorityQueue<ClusteringObject> orderedSeedQueue;
...
orderedSeedQueue = new PriorityQueue<>(clusteringObjects.size(), new ReachabilityObjectComperator());
while (!orderedSeedQueue.isEmpty()) {
            clusteringObject = orderedSeedQueue.poll();
            calculateNeighborhood(clusteringObject, clusteringObjects);
            clusteringObject.setProcessed();
            clusteringObject.setCoreDistance(minNeighbors);
            resultClusterList.add(clusteringObject);
            updateSeedQueue(clusteringObject.getNeighbors(), clusteringObject);
        }

這是我使用優先級隊列的代碼片段。 在updateSeedQueue方法中,某些值會相應地插入到該隊列中進行更新(刪除並再次添加)。 這對我來說很好用,但是每次執行poll()時,所有正確排序的條目都會得到錯誤的順序。

這是我的比較器:

public class ReachabilityObjectComperator implements Comparator<ClusteringObject> {

@Override
public int compare(ClusteringObject x, ClusteringObject y) {
    if (x.getReachabilityDistance() < y.getReachabilityDistance()) {
        return -1;
    } else if(x.getReachabilityDistance() > y.getReachabilityDistance()) {
        return 1;
    } else {
        if(x.getMetadataIndex() < y.getMetadataIndex()) {
            return -1;
        } else if(x.getMetadataIndex() > y.getMetadataIndex()) {
            return 1;
        } else {
            return 0;
        }
    }
}

}

所以我的問題又來了:為什么poll()更改此隊列中其余對象的順序?

PriorityQueue僅聲明以正確的順序進行第一個輸入。 如果您遍歷PriorityQueue,則可以按任何順序看到除第一個元素以外的所有元素,並且在添加/刪除條目時它可能會更改。

從Javadoc for PriorityQueue

不保證方法iterator()中提供的Iterator以任何特定順序遍歷優先級隊列的元素。 如果需要有序遍歷,請考慮使用Arrays.sort(pq.toArray())。

如果您始終需要正確的訂購順序,建議您使用TreeSet。

NavigableSet<MyType> orderedSeedQueue = new TreeSet<>(new MyComparator());
// add elements

while(!orderSeedQueue.isEmpty()) {
     firstItem = orderSeedQueue.pollFirst();

但是,根據您的用例,對它們進行排序可能更簡單。

List<MyType> types = ...
Collections.sort(types, new MyComparator());
for(MyType t : types) { // in sorted order

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM