Java Iterator循环一次,从中间开始

时间:2017-11-08 15:41:37

标签: java loops collections iterator

我有一个迭代器 - 放在我收藏的中间位置。

我想从那里循环遍历集合,如果找到它就返回一个特殊元素。

如果我到达!hasNext()那么我想在开始时开始,但是如果我到达我首先开始的地方,我想停下来。

如何解决这个问题的最佳想法目前似乎是在拯救第一个" (当我开始时迭代器指向的任何地方)元素然后在我再次找到那个时停止。

只要项目在我的集合中只出现一次(即在HasSet中),它就可以工作。

有什么更好的想法怎么做这样的事情?迭代器似乎没有向我提供我可以比较的指针/数字。

3 个答案:

答案 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");
    }