gpt4 book ai didi

java - 使用 Guava Iterables.cycle 作为循环列表实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:28:21 25 4
gpt4 key购买 nike

我有一个 List<Widget>并且正在寻找最有效/最优雅的解决方案来一次又一次地循环它(有点像循环算法):

// Returns a list of 20 widgets, with an id of 1 - 20 respectively.
List<Widget> widgets = getWidgets();
Widget widget = pickWidget(); // Returns the 1st widget with id = 1.
widget = pickWidget(); // Returns the 2nd widget with id = 2.
widget = pickWidget(); // Return the 3rd widget with id = 3.
// ..etc.
widget = pickWidget(); // Returns the 19th widget with id = 19.
widget = pickWidget(); // Returns the 20th widget with id = 20.
widget = pickWidget(); // Returns the 1st widget with id = 1 (it cycle back).

这就是用法,对于实现,我能找到的最好的是 Guava 的 Iterables.cycle(...) :

Widget pickWidget() {
for(Widget w : Iterables.cycle(widgets)) {
return w;
}
}

问题是 cycle不会在 widgets 内留下标记这样它就可以“记住”上次放过的地方pickWidget()被调用了。

这里有什么想法吗? Apache 的 CircularFifoQueue看起来很接近但没有雪茄,因为我不想从队列中弹出任何东西,我只希望它在调用时一次又一次地循环遍历同一个列表。

最佳答案

它不需要留下任何标记。 cycle() 返回的 Iterable 的迭代器在内部保留该标记。您所需要的只是保留对此迭代器的引用:

private Iterator<Widget> cyclingIterator = Iterables.cycle(widgets).iterator();

public Widget pick() {
return cyclingIterator.next();
}

或者简单地说,因为您实际上并不需要 Iterable,而只需要迭代器:

private Iterator<Widget> cyclingIterator = Iterators.cycle(widgets);

public Widget pick() {
return cyclingIterator.next();
}

关于java - 使用 Guava Iterables.cycle 作为循环列表实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32572919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com