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;
}
关注点是
traverse()
来销毁此队列。10
。任何简单而好的解决方案?
答案 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>();
)