当前位置: 首页 > 知识库问答 >
问题:

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

阎元徽
2023-03-14
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);
        }

这里是我的比较器:

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()会改变这个队列中剩余对象的顺序?

共有1个答案

戚峻
2023-03-14

PriorityQueue仅声称以正确的顺序生成第一个条目。如果对PriorityQueue进行迭代,您可以看到除第一个元素以外的所有元素,并且随着添加/删除条目,它可能会发生变化。

从PriorityQueue的Javadoc

方法Iterator()中提供的迭代器不能保证以任何特定的顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用arrays.sort(pq.toArray())。

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
 类似资料:
  • 问题内容: 我正在尝试使用来使用排序对象。 这很容易实现,但是对象类变量(比较器用来计算优先级)在初始插入后可能会更改。大多数人提出了一种简单的解决方案,即删除对象,更新值并再次将其重新插入,因为这是优先级队列的比较器投入使用的时候。 除了围绕PriorityQueue创建包装器类之外,还有其他更好的方法吗? 问题答案: 你必须删除并重新插入,因为队列的工作原理是在插入新元素时将它们放置在适当的位

  • 问题内容: 我在Java整数中有优先级队列: 当我打电话时,我得到了最小的元素。 问题:如何更改代码以获取最大元素? 问题答案: 这样吧: 在提供了一个将在元素进行排序在这种情况下,在该oposite为了自己的自然顺序。

  • 我有一个固定的头与一个标志和一些文本。这些元素当前为白色。(背景颜色:#fff) 当我向下滚动时,各部分以不同的背景颜色显示: 我想改变标题中元素的颜色,这取决于标题当前在上面的部分。我可以做混合模式(白色/黑色),但我也有绿色部分。我也可以这样做,检查什么部分是在视图中,然后改变颜色。 但是我想知道是否有某种方法可以通过JavaScript获得当前在header下面的元素(在div下面的div)

  • 问题内容: 我想动态更新元素的文本: 我是jQuery的新手,因此对我来说,这项任务似乎非常具有挑战性。有人可以指出我要使用的功能/选择器吗? 如果可能的话,我想在不为需要更改的文本添加新容器的情况下执行此操作。 问题答案: 在Javascript中,该属性为您提供元素的所有子节点,包括文本节点。 因此,如果您知道要更改的文本始终是元素中的第一件事,那么请给出以下HTML: 您可以这样做: 当然,

  • 问题内容: 我想使用CSS 更改标签的颜色。我在下面尝试过的代码似乎不起作用: 问题答案: 我想如果您打算更改tag 产生的线条的颜色,则应该使用而不是。 虽然,在注释中已指出,如果您更改线条的大小,边框仍将与样式中指定的宽度一样,并且线条将被填充为默认颜色(大多数情况下这不是理想的效果)时间)。因此,在这种情况下,您似乎还需要指定(如@Ibu在其答案中建议的那样)。 HTML 5 Boilerp

  • 问题内容: 首先,我假设对于CSS3来说这太复杂了,但是如果某个地方有解决方案,我很乐意使用它。 HTML非常简单。 子div设置为显示:无;默认情况下,但更改为display:block; 当鼠标悬停在父div上时。问题是此标记出现在我网站上的多个位置,并且我只希望在鼠标悬停在其父项上方时显示该子项,而不是在鼠标悬停在其他任何父项上时都显示该子项(它们都具有相同的类)名称和ID)。 我尝试使用并