为什么使用“s = --size”而不是“s = size”?

时间:2016-03-01 05:45:20

标签: java data-structures

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 = --sizes = size之间有什么区别?有人可以帮忙吗?提前谢谢。

4 个答案:

答案 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;并使用筛选操作填充数组中的空白siftDownsiftUp

答案 3 :(得分:0)

a = i++表示a = i ; i = i + 1

a = ++i表示i = i + 1 ; a = i ;

相同于减号