在Java中,如何以简单的方式遍历队列而不破坏它?

时间:2013-05-07 23:43:53

标签: java

E.g。

我有一个队列

void someMethod() {

     history.add(new Sample(time, data));
     ...
     traverse(history);
}

void traverse(Queue<Sample> history) {
     for(int i=0; i<history.size(); i=i+10) {
         history.get(i)...  // ???
     }
}

class Sample {
  long time;
  double data;
}

关注点是

  1. 我不想通过调用traverse()来销毁此队列。
  2. 在给定步骤中遍历队列,在此处说10
  3. 任何简单而好的解决方案?

4 个答案:

答案 0 :(得分:8)

for (Sample s : history)
    doStuff(s);

这称为增强的for循环;你可以阅读更多相关信息here

答案 1 :(得分:7)

Queue实现Iterable,因此一个简单的循环将遍历它:

for (Sample sample : history)

Iterator是另一种方法,有更多的控制(如果你愿意,可以销毁它),但更详细。

答案 2 :(得分:2)

如果您只想进行迭代,请使用 for-each循环或直接使用 for循环Iterator。这不会占用队列。

如果需要迭代步骤,可以使用此模式。它通常适用于任何Iterable。将跳过转换为单独的可重用方法使得代码比具有两个嵌套for循环更清晰。

public static void main(String[] args) {
    Queue<Sample> history = ...
    int step = 10;
    for (Iterator<Sample> it = history.iterator();
            it.hasNext(); skip(it, step - 1)) {
        // note that we skipped 1 less elements than the size of the step
        Sample sample = it.next();
        // stuff
    }
}

static void skip(Iterator<?> iterator, int count) {
    for (int i = 0; i < count && iterator.hasNext(); i++) {
        iterator.next();
    }
}

答案 3 :(得分:-1)

LinkedList<Sample> h = (LinkedList<Sample>) history;
for(int i=0; i < h.size(); i+=step) {
    h.get(i).memory ...
}

我刚刚意识到这种方法,还没有尝试过。

正如 nullptr 所指出的,上述代码的条件是Queue被实现为LinkedList。 (这是我的情况:Queue<Sample> history = new LinkedList<Sample>();