【问题标题】:Why isn't my dequeue method working for my treeMap PriceQueue?为什么我的 dequeue 方法不适用于我的 treeMap PriceQueue?
【发布时间】:2019-05-23 01:14:53
【问题描述】:

我有一个 PriceQueue 课程,并且我的所有测试都通过了,除了 2。没有通过的测试是:

public void test05DeleteBackInOrder() {
    PriceQueue pq = new PriceQueue();
    pq.enqueue(p101);
    pq.enqueue(p202);
    pq.enqueue(p303);
    pq.enqueue(p404);
    pq.enqueue(p505);
    assertTrue(pq.delete(p303));
    assertTrue(pq.delete(p404));
    assertTrue(pq.delete(p505));
    assertEquals(p101, pq.dequeue());
    assertEquals(p202, pq.dequeue());

    pq = new PriceQueue();
    pq.enqueue(p101);
    pq.enqueue(p202);
    pq.enqueue(p303);
    pq.enqueue(p404);
    pq.enqueue(p505);
    assertTrue(pq.delete(p303));
    assertTrue(pq.delete(p404));
    assertTrue(pq.delete(p505));
    pq.enqueue(p303);
    pq.enqueue(p404);
    assertEquals(p101, pq.dequeue());
    assertEquals(p202, pq.dequeue());
    assertEquals(p303, pq.dequeue()); //This is where it is failing
    assertEquals(p404, pq.dequeue());
}

public void test05DeleteMiddleInOrder() {
    PriceQueue pq = new PriceQueue();
    pq.enqueue(p101);
    pq.enqueue(p202);
    pq.enqueue(p303);
    pq.enqueue(p404);
    pq.enqueue(p505);
    assertTrue(pq.delete(p202));
    assertTrue(pq.delete(p303));
    assertTrue(pq.delete(p404));
    assertEquals(p101, pq.dequeue());
    assertEquals(p505, pq.dequeue()); // This is where it fails

    pq = new PriceQueue();
    pq.enqueue(p101);
    pq.enqueue(p202);
    pq.enqueue(p303);
    pq.enqueue(p404);
    pq.enqueue(p505);
    assertTrue(pq.delete(p202));
    assertTrue(pq.delete(p303));
    assertTrue(pq.delete(p404));
    pq.enqueue(p202);
    pq.enqueue(p303);
    assertEquals(p101, pq.dequeue());
    assertEquals(p505, pq.dequeue());
    assertEquals(p202, pq.dequeue());
    assertEquals(p303, pq.dequeue());
}

这些是失败的,我不明白我在哪里错过了删除 prie 以便它正确出列。 这是我的代码:

public Price dequeue() {
    if (isEmpty()) throw new NoSuchElementException("Queue underflow");
    Price price = first.price;
    first = first.next;
    n--;
    if (isEmpty()) last = null; 
    hold.remove(hold.lastKey());
    // to avoid loitering
    return price;
}


/**
 * Deletes a Price from the queue if it was present.
 * @param price the Price to be deleted.
 * @return {@code true} if the Price was deleted and {@code false} otherwise
 */
public boolean delete(Price price) {
    // TODO implelment me!!!
    // Make sure the running time is no worse than logrithmic!!!
    // You will want to use Java's TreeMap class to map Prices to the node
    // that precedes the Price in the queue
    //last node==special case
    //^^ requires resetting prev. to null, and val to next
    if (hold.containsKey(price)) {
        Node temp = hold.get(price);
        //if (price.equals(f))
        if (price.equals(first.price) && n >= 3) {
            first = first.next;
            n--;
            hold.remove(price);
            return true;
        }
        if (price.equals(first.price)) {
            first = first.next;
            hold.remove(price);
            n--;
            return true;
        }
        if (price.equals(last.price)) {
            temp.next = null;
            last = temp;
            n--;
            hold.remove(price);
            return true;
        }
        if (temp.next != (null)) {
            temp.next = temp.next.next;
            n--;
            hold.remove(price);
            return true;
        }

        return true;
    }
    else return false;

}

感谢任何帮助,即使是提示或提示。如果需要其他任何东西,请告诉我,我会提供,这些只是我的代码的一部分。 谢谢!

【问题讨论】:

    标签: java data-structures queue nodes treemap


    【解决方案1】:

    关于标准出队的快速答案是简单地返回 remove 的输出。

    public Price dequeue(){
        return some_list.remove(0); //null if empty
    }
    

    Remove 返回它删除的元素,并自动将被删除项 1 之后的元素向左移动。如果项目不存在(列表为空),则返回 null。

    【讨论】:

    • PS:java中还有一个标准的队列对象。
    • 感谢您的快速回复!这是行不通的,因为它是一个用 TreeMap 类映射的队列。
    • @A.Garcia 啊,很抱歉造成误会。由于 TreeMap 是自动排序的,是不是可以做 tMap.remove(tMap.firstKey())。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2013-03-26
    • 2019-05-21
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多