Перейти к основному содержимому

Получение размера итерируемого объекта в Java

· 3 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Обзор

В этом кратком руководстве мы узнаем о различных способах получения размера Iterable в Java.

2. Итерируемый и итератор

Iterable — один из основных интерфейсов классов коллекций в Java.

Интерфейс Collection расширяет Iterable , поэтому все дочерние классы Collection также реализуют Iterable .

Iterable имеет только один метод, который создает Iterator :

public interface Iterable<T> {
public Iterator<T> iterator();
}

Затем этот итератор можно использовать для перебора элементов в Iterable .

3. Итерируемый размер с использованием Core Java

3.1. для каждого цикла

Все классы, реализующие Iterable , подходят для цикла for-each в Java.

Это позволяет нам перебирать элементы в Iterable , увеличивая счетчик, чтобы получить его размер:

int counter = 0;
for (Object i : data) {
counter++;
}
return counter;

3.2. Коллекция.размер()

В большинстве случаев Iterable будет экземпляром Collection, например List или Set .

В таких случаях мы можем проверить тип Iterable и вызвать для него метод size() , чтобы получить количество элементов.

if (data instanceof Collection) {
return ((Collection<?>) data).size();
}

Вызов size() обычно намного быстрее, чем перебор всей коллекции.

Вот пример, показывающий комбинацию двух вышеуказанных решений:

public static int size(Iterable data) {

if (data instanceof Collection) {
return ((Collection<?>) data).size();
}
int counter = 0;
for (Object i : data) {
counter++;
}
return counter;
}

3.3. Поток.счет()

Если мы используем Java 8, мы можем создать поток из Iterable.

Затем объект потока можно использовать для получения количества элементов в Iterable .

return StreamSupport.stream(data.spliterator(), false).count();

4. Итерируемый размер с использованием сторонних библиотек

4.1. IterableUtils#размер()

В библиотеке Apache Commons Collections есть хороший класс IterableUtils , предоставляющий статические служебные методы для экземпляров Iterable .

Прежде чем мы начнем, нам нужно импортировать последние зависимости из Maven Central :

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

Мы можем вызвать метод size () объекта IterableUtils для объекта Iterable , чтобы получить его размер.

return IterableUtils.size(data);

4.2. Итерации#размер()

Точно так же библиотека Google Guava также предоставляет набор статических служебных методов в своем классе Iterables для работы с экземплярами Iterable .

Прежде чем мы начнем, нам нужно импортировать последние зависимости из Maven Central :

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

Вызов статического метода size() в классе Iterables дает нам количество элементов.

return Iterables.size(data);

Под капотом и IterableUtils , и Iterables используют комбинацию подходов, описанных в 3.1 и 3.2, для определения размера.

5. Вывод

В этой статье мы рассмотрели различные способы получения размера Iterable в Java.

Исходный код этой статьи и соответствующие тестовые примеры доступны на GitHub .