Итерация по диапазону повторяемых - PullRequest
1 голос
/ 14 декабря 2010

У меня есть интерфейс, который возвращает повторяемый объект. Мне нужно повторить первые 1000 пунктов этого. Каков наилучший способ комбинировать итерацию с использованием Iterator и останавливаться после достижения определенного количества.

Спасибо

Ответы [ 4 ]

1 голос
/ 14 декабря 2010

Какой у вас язык?

C #:

using System.Linq;
//...
foreach (var item in iface.GetIterable().Take(1000))
{
    //...
}

Python:

import itertools
#...
for item in itertools.islice(iface.get_iterable(), 1000):
    #...
1 голос
/ 14 декабря 2010

Я бы использовал цикл, который повторяется и увеличивает значение счетчика;затем вырвитесь из цикла, когда счетчик достигнет 1000.

0 голосов
/ 24 декабря 2010

Вот обёртка, управляемая тестами (Java), вокруг любого существующего итератора, которая должна сделать свое дело.

package com.playground;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;

public class LimitedIterableTest extends TestCase {

    private static class LimitedIterator<T> implements Iterator<T> {
        private final Iterator<T> original;
        private final int limit;
        private int index = 0;

        public LimitedIterator(Iterator<T> iterator, int limit) {
            this.original = iterator;
            this.limit = limit;
        }

        public boolean hasNext() {
            return index < limit && original.hasNext();
        }

        public T next() {
            index++;
            return original.next();
        }

        public void remove() {
            original.remove();
        }
    }

    private static class LimitedIterable<T> implements Iterable<T> {
        private final int limit;
        private final Iterable<T> original;

        public LimitedIterable(Iterable<T> iterable, int limit) {
            this.original = iterable;
            this.limit = limit;
        }

        public Iterator<T> iterator() {
            return new LimitedIterator<T>(original.iterator(), limit);
        }
    }

    final Integer[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    final List<Integer> list = Arrays.asList(array);

    public void testCount() throws Exception {
        assertEquals(10, count(list));
    }

    public void testLimitedIterable() throws Exception {
        Iterable<Integer> limited = new LimitedIterable<Integer>(list, 5);
        assertEquals(5, count(limited));
        limited = new LimitedIterable<Integer>(list, 50);
        assertEquals(10, count(limited));
    }

    private static <T> int count(Iterable<T> iterable) {
        Iterator<T> iterator = iterable.iterator();
        return count(iterator);
    }

    private static <T> int count(Iterator<T> iterator) {
        int count = 0;
        while (iterator.hasNext()) {
            iterator.next();
            count++;
        }
        return count;
    }
}
0 голосов
/ 14 декабря 2010

Создайте стандартный цикл, повторяющий вашу коллекцию, но проверьте, не достиг ли индекс прогресса после целевого индекса.

Возможно, вы захотите извлечь отдельный счетчик из индекса основного цикла для вашего конкретного приложения.

int stopIndex = 1000;

for (int index = 0; index <= theInterface.Count; index++)
{
    // check to see if we're at/past the stopIndex
    if (index >= stopIndex)
        break;

    // we're still within the conditions, so do something with your interface
    myObjectType localObject = (MyObjectType)theInterface.IndexOf(index);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...