我有一个迭代器 - 放在我收藏的中间位置。
我想从那里循环遍历集合,如果找到它就返回一个特殊元素。
如果我到达!hasNext()那么我想在开始时开始,但是如果我到达我首先开始的地方,我想停下来。
如何解决这个问题的最佳想法目前似乎是在拯救第一个" (当我开始时迭代器指向的任何地方)元素然后在我再次找到那个时停止。
只要项目在我的集合中只出现一次(即在HasSet中),它就可以工作。
有什么更好的想法怎么做这样的事情?迭代器似乎没有向我提供我可以比较的指针/数字。
答案 0 :(得分:2)
使用Guava迭代器(Java 7):
Iterator<YourType> iterator = Iterators.concat(yourIteratorPlaceSomewhereInMiddle, Iterators.limit(yourCollection.iterator(), positionOfSomewhereInMiddle));
使用Streams(Java 8):
Optional<YourType> theAnswer = IntStream.iterate(positionOfSomewhereInMiddle, pos -> ++pos)
.map(pos -> pos % sizeOfCollection)
.mapToObj(yourCollection::get)
.limit(sizeOfCollection)
.filter(element -> element is 42)
.findFirst();
答案 1 :(得分:0)
如果集合是一个列表,那么可以使用下面的代码
完成private void Object traverseList(List namesList, int startIndex ) {
int index = 0;
Iterator iterator = namesList.listIterator(startIndex);
while (iterator.hasNext() && index < namesList.size()){
Object element = iterator.next();
/*if(element.isSpecialElement()){
return element;
}
*/
index++;
System.out.println(element);
if(!iterator.hasNext()){
iterator = namesList.iterator();
}
}
}
由于你想横向列表中的所有元素,我正在使用列表大小。在迭代期间,如果找到特殊元素,则可以返回它。
答案 2 :(得分:-1)
如果您:
,解决方案将变得更加简单Iterator
,这会使其更复杂使用List
代替Set
因为Set
不适合此用例
public static void main(String[] args) {
Set<String> yourStartingCollection = new HashSet<>();
List<String> fooList = new ArrayList<>(yourStartingCollection);
Optional<String> specialElement = findSpecialElementStartingFromMiddle(fooList);
if (specialElement.isPresent()) {
// found it!
}
}
private static Optional<String> findSpecialElementStartingFromMiddle(List<String> elements) {
int middleIndex = elements.size() / 2;
Optional<String> result = Optional.empty();
for (int i = middleIndex; i < elements.size(); i++) {
String element = elements.get(i);
if (isSpecial(element)) {
result = Optional.of(element);
break;
}
}
if (result.isPresent()) {
return result;
}
for (int i = 0; i < middleIndex; i++) {
String element = elements.get(i);
if (isSpecial(element)) {
result = Optional.of(element);
break;
}
}
return result;
}
private static boolean isSpecial(String element) {
return element.equals("I'm special");
}