【问题标题】:Strange Queue Behavior奇怪的队列行为
【发布时间】:2012-11-28 05:47:50
【问题描述】:

我在 Java 中有一个显示奇怪行为的队列。如果我调用q.size(),元素被推入队列后,只有前半部分的项目会从同一个队列中弹出。但是,如果我在从q 弹出任何项目之前存储q.size() 返回的值,则会弹出所有项目。这是为什么? official documentation 说:

public int size()

返回此列表中的元素数。

这是我正在使用的代码。我使用了三种不同的编译器:JDK 6.0_31、JDK 7.0_7 和 Eclipse Compiler 0.A48。结果是一样的。

import java.util.*;

public class StrangeQueueTest{
   public static void main(String[] args){
      Queue<String> q = new LinkedList<String>();
      String[] testData = {"1: one", "2: two", "3: three", "4: four", "5: five",
         "6: six", "7: seven", "8: eight", "9: nine", "10: ten", "11: eleven",
         "12: twelve", "13: thirteen", "14: fourteen", "15: fifteen",
         "16: sixteen", "17: seventeen", "18: eighteen", "19: nineteen",
         "20: twenty"};
      
      //Push items into the queue
      for(int x = 0; x < testData.length; x++)
         q.add(testData[x]);
      
      //Pop items out of the queue, calling size() at every iteration
      for(int x = 0; x < q.size(); x++)
         System.out.println(q.poll());
      
      //Pop items out of the queue, calling size() once
      /*int count = q.size();
      for(int x = 0; x < count; x++)
         System.out.println(q.poll());*/
   }
}

为什么size() 方法不能始终如一地工作?难道我做错了什么?如果有,是什么?

【问题讨论】:

标签: java data-structures queue


【解决方案1】:

你只能得到一半的元素,因为你是从两端开始数的,当你到达中间时你会停下来。换句话说:每次你poll(),你都会将size()减少一个。同时,您正在计算已删除的数量。问题是当您删除的数字至少与剩余大小一样大时,您已将循环编码为停止。

而不是这个:

for(int x = 0; x < q.size(); x++)
     System.out.println(q.poll());

使用这个:

while (q.size() > 0)
     System.out.println(q.poll());

【讨论】:

    【解决方案2】:

    (这确实是一个扩展评论。我同意之前的答案。)

    几乎总是,当 API 方法似乎没有遵循其规范时,问题实际上出在测试程序中。下一个问题是最初的提问者如何在没有看到问题的情况下发现发生了什么。

    调试的第一步是获取信息。循环中 x 和 q.size() 的行为似乎可能相关,因此我将循环修改为:

      for (int x = 0; x < q.size(); x++) {
        System.out.println("x=" + x + ", q.size()=" + q.size());
        System.out.println(q.poll());
      }
    

    并运行程序。输出是:

        x=0, q.size()=20
        1: one
        x=1, q.size()=19
        2: two
        x=2, q.size()=18
        3: three
        x=3, q.size()=17
        4: four
        x=4, q.size()=16
        5: five
        x=5, q.size()=15
        6: six
        x=6, q.size()=14
        7: seven
        x=7, q.size()=13
        8: eight
        x=8, q.size()=12
        9: nine
        x=9, q.size()=11
        10: ten
    

    这个输出表明循环的每次迭代都会增加 x 并减小队列大小,导致 x 在中途停止小于大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2019-05-05
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多