1

例如

我有一个队列

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这里说。

任何简单而好的解决方案?

4

4 回答 4

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

这称为增强的 for 循环;你可以在这里阅读更多关于它的信息。

于 2013-05-07T23:44:50.387 回答
8

Queueimplements Iterable,所以一个简单的循环将遍历它:

for (Sample sample : history)

AnIterator是另一种实现方式,具有更多控制权(如果您愿意,可以将其销毁),但更冗长。

于 2013-05-07T23:45:16.670 回答
3

如果您只想迭代,请使用for-each 循环直接使用带有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();
    }
}
于 2013-05-07T23:54:57.380 回答
-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>();:)

于 2013-05-08T00:11:21.437 回答