Java返回Array并删除最后一项?

时间:2017-11-02 01:53:12

标签: java arrays

所以我正在学习算法的课程(由Sedgewick教授,很棒的课程顺便说一句),这个"无序的数组优先级队列中有一部分我很困惑"

    public class UnorderedPQ < Item extends Comparable > {
       private Comparable[] pq;
       private int N;
       public UnorderedPQ(int maxN) {
        pq = new Comparable[maxN];
       }
       public boolean isEmpty() {
        return N == 0;
       }
       public void insert(Item x) {
        pq[N++] = x;
       }
       public Item delMax() {
        int max = 0;
        for (int i = 1; i < N; i++)
         if (less(max, i)) max = i;
        exch(max, N - 1);
        return (Item) pq[--N];
       }
      }

return (Item) pq[--N];&lt; ---这一部分,评论说明&#34;从PQ中删除并返回最大元素&#34;

所以基本上我理解的只是pq[--N],请记住,我基本上从未做过任何java。

我明白为什么这会返回第N-1个数组项....但是它究竟会如何完全删除它。在课程中,它声明我们这样做是为了防止游荡,并且#34;?但我不完全确定它是如何工作的?

旁注:任何想法为什么在for循环中为delMax()从1开始?我认为这是因为我们正在加入前面,所以他们没有理由我们检查第一项?

1 个答案:

答案 0 :(得分:3)

你有两个问题:

1) pq[--N]如何完全删除该项?答案是它没有。它有效地通过递减N来删除它,因此它不会被视为优先级队列中的存在,但对Item的引用仍然存在于数组中{ {1}}。要完全删除它(并使其符合垃圾回收条件),数组元素应该已设置为pq。我将其归类为内存泄漏。

2)为什么null中的循环从1开始?它从1开始的原因是前一行 - delMax() - 将元素0设置为最大元素。检查元素0是否小于它本身是没有意义的。