Groovy .collect с ограничением числа элементов - PullRequest
5 голосов
/ 21 ноября 2011

Есть ли способ использовать метод groovy .collect, но только с определенным индексом в исходном массиве?

Например, если исходный итератор был длиной 1 миллион, а лимит был равен 100в итоге вы получите массив из 100 элементов.

Ответы [ 3 ]

20 голосов
/ 21 ноября 2011

Начиная с Groovy 1.8.1 вы также можете сделать

list.take(100).collect { ... }

где take вернет первые 100 элементов из списка.

3 голосов
/ 21 ноября 2011

Вы можете использовать диапазон индексов для получения подсписка, а затем применить collect к подсписку.

def result = list[0..100].collect { ... }
3 голосов
/ 21 ноября 2011

Если вы используете любую структуру данных, которая реализует java.util.List, вы можете использовать collection.subList(0, 100) для нее.Где 0 - начальный индекс, а 100 - конец.После этого вы передадите новую коллекцию в collect().

. Вот пример использования объекта, расширяющего java.util.Iterator:

public class LimitIterator implements Iterator, Iterable {
   private it
   private limit
   private count

   LimitIterator(Iterator it, int limit) {
      limit = limit;
      count = 0;
      it = it
   }

   boolean hasNext(){
      return (count >= limit) ? false : it.hasNext()
   }

   Object next() {
      if (!hasNext()) throw new java.util.NoSuchElementException()

      count++
      return it.next()
   }

   Iterator iterator(){
      return this;
   }

   void remove(){
      throw new UnsupportedOperationException("remove() not supported")
   }

}

// Create a range from 1 to 10000
// and an empty list.
def list = 1..10000
def shortList = []

// Ensure that everything is as expected
assert list instanceof java.util.List
assert list.iterator() instanceof java.util.Iterator
assert list.size() == 10000
assert shortList instanceof java.util.List

// Grab the first 100 elements out of the lists iterator object.
for (i in new LimitIterator(list.iterator(), 100)) {
    shortlist.add(i);
}
assert shortlist.size() == 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...