PriorityQueue的代码:
private E removeAt(int i) {
assert i >= 0 && i < size;
modCount++;
int s = --size; // <- Why???
if (s == i) // removed last element
queue[i] = null;
else {
E moved = (E) queue[s];
queue[s] = null;
siftDown(i, moved);
if (queue[i] == moved) {
siftUp(i, moved);
if (queue[i] != moved)
return moved;
}
}
return null;
}
s = --size
和s = size
之间有什么区别?有人可以帮忙吗?提前谢谢。
答案 0 :(得分:3)
int s = --size;
是pre-decrement operator,并不等同于int s = size;
。它相当于
int s = (size = (size - 1));
或强>
size = size - 1;
int s = size;
但更短比这两者都要短。
答案 1 :(得分:1)
如果您使用s = size
,则需要添加第size = size - 1
行。因为您必须在删除元素后减少队列大小。
答案 2 :(得分:0)
PriorityQueue基于数组private transient Object[] queue;
。在PriorityQueue中,此数组存储二进制堆的数据。 removeAt(int)
是从堆中删除元素的操作。通过使用堆的最后一个元素从堆中删除元素(这里使用int s = --size
将s分配给最后一个元素的索引;或者你可以执行int s = heap.length - 1
)。
然后删除您想要的元素queue[s] = null;
并使用筛选操作填充数组中的空白siftDown
,siftUp
。
答案 3 :(得分:0)
a = i++
表示a = i ; i = i + 1
a = ++i
表示i = i + 1 ; a = i ;
相同于减号