Как найти индекс элемента массива java

For primitive arrays

Starting with Java 8, the general purpose solution for a primitive array arr, and a value to search val, is:

public static int indexOf(char[] arr, char val) {
    return IntStream.range(0, arr.length).filter(i -> arr[i] == val).findFirst().orElse(-1);
}

This code creates a stream over the indexes of the array with IntStream.range, filters the indexes to keep only those where the array’s element at that index is equal to the value searched and finally keeps the first one matched with findFirst. findFirst returns an OptionalInt, as it is possible that no matching indexes were found. So we invoke orElse(-1) to either return the value found or -1 if none were found.

Overloads can be added for int[], long[], etc. The body of the method will remain the same.

For Object arrays

For object arrays, like String[], we could use the same idea and have the filtering step using the equals method, or Objects.equals to consider two null elements equal, instead of ==.

But we can do it in a simpler manner with:

public static <T> int indexOf(T[] arr, T val) {
    return Arrays.asList(arr).indexOf(val);
}

This creates a list wrapper for the input array using Arrays.asList and searches the index of the element with indexOf.

This solution does not work for primitive arrays, as shown here: a primitive array like int[] is not an Object[] but an Object; as such, invoking asList on it creates a list of a single element, which is the given array, not a list of the elements of the array.

Given an array of N elements and an element K, find the index of an array element in Java. 
Examples: 

Input: a[] = { 5, 4, 6, 1, 3, 2, 7, 8, 9 }, K = 5
Output: 0

Input: a[] = { 5, 4, 6, 1, 3, 2, 7, 8, 9 }, K = 7
Output: 6

An element in an array of N integers can be searched using the below-mentioned methods.  

  1. Linear Search: Doing a linear search in an array, the element can be found in O(N) complexity. 
    Below is the implementation of the linear-search approach:

Java

import java.util.*;

public class index {

    public static int findIndex(int arr[], int t)

    {

        if (arr == null) {

            return -1;

        }

        int len = arr.length;

        int i = 0;

        while (i < len) {

            if (arr[i] == t) {

                return i;

            }

            else {

                i = i + 1;

            }

        }

        return -1;

    }

    public static void main(String[] args)

    {

        int[] my_array = { 5, 4, 6, 1, 3, 2, 7, 8, 9 };

        System.out.println("Index position of 5 is: "

                           + findIndex(my_array, 5));

        System.out.println("Index position of 7 is: "

                           + findIndex(my_array, 7));

    }

}

Output:

Index position of 5 is: 0
Index position of 7 is: 6

Time Complexity: O(N)
Auxiliary Space: O(1)

2. Binary search: Binary search can also be used to find the index of the array element in an array. But the binary search can only be used if the array is sorted. Java provides us with an inbuilt function which can be found in the Arrays library of Java which will return the index if the element is present, else it returns -1. The complexity will be O(log n). 
Below is the implementation of Binary search. 

Java

import java.util.Arrays;

public class index {

    public static int findIndex(int arr[], int t)

    {

        int index = Arrays.binarySearch(arr, t);

        return (index < 0) ? -1 : index;

    }

    public static void main(String[] args)

    {

        int[] my_array = { 1, 2, 3, 4, 5, 6, 7 };

        System.out.println("Index position of 5 is: "

                           + findIndex(my_array, 5));

        System.out.println("Index position of 7 is: "

                           + findIndex(my_array, 7));

    }

}

Output:

Index position of 5 is: 4
Index position of 7 is: 6

Time Complexity: O(log N)
Auxiliary Space: O(1)

3. Guava: Guava is an open source, Java-based library developed by Google. It provides utility methods for collections, caching, primitives support, concurrency, common annotations, string processing, I/O, and validations. Guava provides several-utility class pertaining to be primitive like Ints for int, Longs for long, Doubles for double etc. Each utility class has an indexOf() method that returns the index of the first appearance of the element in array.

Below is the implementation of Guava.

Java

import java.util.List;

import com.google.common.primitives.Ints;

public class index {

    public static int findIndex(int arr[], int t)

    {

        return Ints.indexOf(arr, t);

    }

    public static void main(String[] args)

    {

        int[] my_array = { 5, 4, 6, 1, 3, 2, 7, 8, 9 };

        System.out.println("Index position of 5 is: "

                           + findIndex(my_array, 5));

        System.out.println("Index position of 7 is: "

                           + findIndex(my_array, 7));

    }

}

Output:

Index position of 5 is: 0
Index position of 7 is: 6

Time Complexity: O(N)
Auxiliary Space: O(1)

4. Stream API: Stream is a new abstract layer introduced in Java 8. Using stream, you can process data in a declarative way similar to SQL statements. The stream represents a sequence of objects from a source, which supports aggregate operations. In order to find the index of an element Stream package provides utility, IntStream. Using the length of an array we can get an IntStream of array indices from 0 to n-1, where n is the length of an array.
Below is the implementation of Stream API approach. 

Java

import java.util.stream.IntStream;

public class index {

    public static int findIndex(int arr[], int t)

    {

        int len = arr.length;

        return IntStream.range(0, len)

            .filter(i -> t == arr[i])

            .findFirst()

            .orElse(-1);

    }

    public static void main(String[] args)

    {

        int[] my_array = { 5, 4, 6, 1, 3, 2, 7, 8, 9 };

        System.out.println("Index position of 5 is: "

                           + findIndex(my_array, 5));

        System.out.println("Index position of 7 is: "

                           + findIndex(my_array, 7));

    }

}

Output:

Index position of 5 is: 0
Index position of 7 is: 6

Time Complexity: O(N)
Auxiliary Space: O(1)

5. Using ArrayList

In this approach, we will convert the array into ArrayList, and then we will use the indexOf method of ArrayList to get the index of the element.

Java

import java.util.ArrayList;

public class GFG {

    public static int findIndex(int arr[], int t)

    {

        ArrayList<Integer> clist = new ArrayList<>();

        for (int i : arr)

            clist.add(i);

        return clist.indexOf(t);

    }

    public static void main(String[] args)

    {

        int[] my_array = { 5, 4, 6, 1, 3, 2, 7, 8, 9 };

        System.out.println("Index position of 5 is: "

                           + findIndex(my_array, 5));

        System.out.println("Index position of 7 is: "

                           + findIndex(my_array, 7));

    }

}

Output:

Index position of 5 is: 0
Index position of 7 is: 6

Time Complexity: O(N)
Auxiliary Space: O(N)

6. Using Recursion

We will use recursion to find the first index of the given element.

Java

public class GFG {

    public static int index(int arr[], int t, int start)

    {

        if(start==arr.length)

            return -1;

        if(arr[start]==t)

            return start;

        return index(arr,t,start+1);

    }

    public static int findIndex(int arr[], int t)

    {

        return index(arr,t,0);

    }

    public static void main(String[] args)

    {

        int[] my_array = { 5, 4, 6, 1, 3, 2, 7, 8, 9 };

        System.out.println("Index position of 5 is: "

                + findIndex(my_array, 5));

        System.out.println("Index position of 7 is: "

                + findIndex(my_array, 7));

    }

}

Output:

Index position of 5 is: 0
Index position of 7 is: 6

Time Complexity: O(N)
Auxiliary Space: O(1)

Last Updated :
20 Feb, 2023

Like Article

Save Article

В этом посте будет обсуждаться, как найти индекс элемента в массиве примитивов или объектов в Java.

Решение должно либо возвращать индекс первого вхождения требуемого элемента, либо -1, если его нет в массиве.

1. Наивное решение — линейный поиск

Наивное решение состоит в том, чтобы выполнить линейный поиск в заданном массиве, чтобы определить, присутствует ли целевой элемент в массиве.

⮚ Для примитивных массивов:

// Метод поиска индекса элемента в примитивном массиве в Java

public static int find(int[] a, int target)

{

    for (int i = 0; i < a.length; i++)

    {

        if (a[i] == target) {

            return i;

        }

    }

    return 1;

}

⮚ Для массивов объектов:

// Общий метод для поиска индекса элемента в массиве объектов в Java

public static<T> int find(T[] a, T target)

{

    for (int i = 0; i < a.length; i++)

    {

        if (target.equals(a[i])) {

            return i;

        }

    }

    return 1;

}

2. Использование потока Java 8

Мы можем использовать Java 8 Stream для поиска индекса элемента в массиве примитивов и объектов, как показано ниже:

⮚ Для примитивных массивов:

// Метод поиска индекса элемента в примитивном массиве в Java

public static int find(int[] a, int target)

{

    return IntStream.range(0, a.length)

                    .filter(i -> target == a[i])

                    .findFirst()

                    .orElse(1);    // вернуть -1, если цель не найдена

}

⮚ Для массивов объектов:

// Общий метод для поиска индекса элемента в массиве объектов в Java

public static<T> int find(T[] a, T target)

{

    return IntStream.range(0, a.length)

                    .filter(i -> target.equals(a[i]))

                    .findFirst()

                    .orElse(1);    // вернуть -1, если цель не найдена

}

3. Преобразовать в список

Идея состоит в том, чтобы преобразовать данный массив в список и использовать List.indexOf() метод, который возвращает индекс первого вхождения указанного элемента в этом списке.

⮚ Для примитивных массивов:

Как преобразовать примитивный целочисленный массив в List<Integer>?

// Метод поиска индекса элемента в примитивном массиве в Java

public static int find(int[] a, int target)

{

    return Arrays.stream(a)                     // IntStream

                .boxed()                        // Stream<Integer>

                .collect(Collectors.toList())   // List<Integer>

                .indexOf(target);

}

⮚ Для массивов объектов:

Как преобразовать массив объектов в список?

// Общий метод для поиска индекса элемента в массиве объектов в Java

public static<T> int find(T[] a, T target) {

    return Arrays.asList(a).indexOf(target);

}

4. Бинарный поиск отсортированных массивов

Для отсортированных массивов мы можем использовать Алгоритм бинарного поиска для поиска указанного массива для указанного значения.

⮚ Для примитивных массивов:

// Метод поиска индекса элемента в примитивном массиве в Java

public static int find(int[] a, int target)

{

    int index = Arrays.binarySearch(a, target);

    return (index < 0) ? 1 : index;

}

⮚ Для массивов объектов:

// Общий метод для поиска индекса элемента в массиве объектов в Java

public static<T> int find(T[] a, T target)

{

    int index = Arrays.binarySearch(a, target);

    return (index < 0) ? 1 : index;

}

5. Использование библиотеки Guava

⮚ Для примитивных массивов:

Библиотека Guava предоставляет несколько служебных классов, относящихся к примитивам, например Ints для инт, Longs надолго, Doubles на двоих, Floats для поплавка, Booleans для логического значения и так далее.

Каждый класс полезности имеет indexOf() метод, который возвращает индекс первого появления цели в массиве. Мы также можем использовать lastIndexOf() чтобы вернуть индекс последнего появления цели в массиве.

// Метод поиска индекса элемента в примитивном массиве в Java

public static int find(int[] a, int target) {

    return Ints.indexOf(a, target);

}

⮚ Для массивов объектов:

Guava’s com.google.commons.collect.Iterables класс содержит статический служебный метод indexOf(Iterator, Predicate) который возвращает индекс первого элемента, удовлетворяющего предоставленному предикату, или -1, если итератор не имеет таких элементов.

// Общий метод для поиска индекса элемента в массиве объектов в Java

public static<T> int find(T[] a, T target)

{

    int index = Iterators.indexOf(Iterators.forArray(a), new Predicate<T>()

    {

        public boolean apply(T input) {

            return input.equals(target);

        }

    });

    return index;

}

 
Мы также можем использовать com.google.common.base.Predicates класс, предоставляемый Guava, который содержит статические служебные методы, относящиеся к Predicate экземпляры.

// Общий метод для поиска индекса элемента в массиве объектов в Java

public static<T> int find(T[] a, T target)

{

    int index = Iterators.indexOf(Iterators.forArray(a),

                            Predicates.in(Collections.singleton(target)));

    return index;

}

 
Для Java 8 и выше мы можем использовать лямбда-выражения:

// Общий метод для поиска индекса элемента в массиве объектов в Java

public static<T> int find(T[] a, T target) {

    return Iterators.indexOf(Iterators.forArray(a), x -> x.equals(target));

}

6. Использование Apache Commons Lang

Apache Commons Ланг ArrayUtils класс содержит несколько статических служебных методов, которые работают с массивами примитивов или объектов. Он обеспечивает indexOf() метод, который находит индекс заданного значения в массиве.

⮚ Для примитивных массивов:

// Метод поиска индекса элемента в примитивном массиве в Java

public static int find(int[] a, int target) {

    return ArrayUtils.indexOf(a, target);

}

⮚ Для массивов объектов:

// Общий метод для поиска индекса элемента в массиве объектов в Java

public static<T> int find(T[] a, T target) {

    return ArrayUtils.indexOf(a, target);

}

Вот и все, что касается поиска индекса элемента в массиве в Java.

Чтобы найти индекс искомого элемента в массиве можно в цикле перебрать все элементы и сравнить их с искомым. Если они равны, будет выведен индекс первого подходящего элемента.


// Число, которое будем искать
int num = 3;

// Переменная для хранения индекса,
// найденного числа
int index = -1;

int[] arr = {1, 2, 3, 4, 5};

for (int i = 0; i < arr.length; i++) {
    // Если элемент и число равны, то 
    // сохраняй индекс
    if (arr[i] == num) {
        index = i;
    }
}

System.out.println(index); // => 2

Также можно воспользоваться пакетом org.apache.commons.lang, методом indexOf() из класса ArrayUtils для нахождения индекса элемента.

import org.apache.commons.lang3.ArrayUtils;

public class Example {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        // индекс числа 3
        int index = ArrayUtils.indexOf(arr, 3);

        System.out.println(index); // => 2
    }
}

  1. Get Index of an Element in an Integer Type Array in Java
  2. Get Index of an Array Element Using Java 8 Stream API in Java
  3. Get Index of an Array Element Using ArrayUtils.indexOf() in Java

Java Array Indexof

This article introduces how to get the index of an array in Java using different techniques.

Get Index of an Element in an Integer Type Array in Java

There is no indexOf() method for an array in Java, but an ArrayList comes with this method that returns the index of the specified element. To access the indexOf() function, we first create an array of Integer and then convert it to a list using Arrays.asList().

Notice that we use a wrapper class Integer instead of a primitive int because asList() only accepts wrapper classes, but they do return the result as a primitive data type. We can check the following example, where we specify the element i.e. 8 to the indexOf() method to get its index. The result we get from getIndex is of the int type.

import java.util.Arrays;

public class ArrayIndexOf {
    public static void main(String[] args) {
        Integer[] array1 = {2, 4, 6, 8, 10};

        int getIndex = Arrays.asList(array1).indexOf(8);

        System.out.println("8 is located at "+getIndex+" index");
    }
}

Output:

Get Index of an Array Element Using Java 8 Stream API in Java

We can use the Stream API to filter out the array items and get the position of the specified element. IntStream is an interface that allows a primitive int to use the Stream functions like filter and range.

range() is a method of IntStream that returns the elements from the starting position till the end of the array. Now we use filter() that takes a predicate as an argument. We use i -> elementToFind == array1[i] as the predicate where i is the value received from range() and elementToFind == array1[i] is the condition to check if the elementToFind matches with the current element of the array1.

findFirst() returns the first element and orElse() returns -1 if the condition fails.

import java.util.stream.IntStream;

public class ArrayIndexOf {
    public static void main(String[] args) {
        int[] array1 = {1, 3, 5, 7, 9};

        int elementToFind = 3;

        int indexOfElement = IntStream.range(0, array1.length).
                filter(i -> elementToFind == array1[i]).
                findFirst().orElse(-1);

        System.out.println("Index of " + elementToFind + " is " + indexOfElement);

    }
}

Output:

Get Index of an Array Element Using ArrayUtils.indexOf() in Java

This example uses the ArrayUtls class that is included in the Apache Commons Library. We use the below dependency to import the library functions to our project.

  <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
  </dependency>

We use the indexOf() function of the ArrayUtils class to find the index of the array. indexOf() accepts two arguments, the first argument is the array, and the second argument is the element of which we want to find the index.

import org.apache.commons.lang3.ArrayUtils;

public class ArrayIndexOf {
    public static void main(String[] args) {
        int[] array1 = {1, 3, 5, 7, 9};

        int elementToFind = 9;

        int indexOfElement = ArrayUtils.indexOf(array1, elementToFind);
        System.out.println("Index of " + elementToFind + " is " + indexOfElement);

    }
}

Output:

Добавить комментарий