繁体   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