Где Java Array indexOf?

Мне нужно пропустить что-то очень очевидное, но я искал все и не могу найти этот метод.

Ответ 1

Есть несколько способов сделать это, используя класс утилиты Arrays.

Если массив не отсортирован и не является массивом примитивов:

java.util.Arrays.asList(theArray).indexOf(o)

Если массив является примитивным и не отсортированным, следует использовать решение, предлагаемое одним из других ответов, таких как Kerem Baydoğan, Andrew McKinlay или Mishax's. Вышеприведенный код будет скомпилирован, даже если theArray является примитивным (возможно, theArray предупреждение), но вы получите абсолютно неверные результаты.

Если массив отсортирован, вы можете использовать бинарный поиск производительности:

java.util.Arrays.binarySearch(theArray, o)

Ответ 2

Массив не имеет метода indexOf().

Возможно, этот Apache Commons Lang ArrayUtils метод - это то, что вы ищете

import org.apache.commons.lang3.ArrayUtils;

String[] colours = { "Red", "Orange", "Yellow", "Green" };

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");

Ответ 3

Нет. Либо используйте java.util.List *, либо вы можете написать свой собственный indexOf():

public static <T> int indexOf(T needle, T[] haystack)
{
    for (int i=0; i<haystack.length; i++)
    {
        if (haystack[i] != null && haystack[i].equals(needle)
            || needle == null && haystack[i] == null) return i;
    }

    return -1;
}

* вы можете сделать один из своего массива с помощью Arrays#asList()

Ответ 4

Для примитивов, если вы хотите избежать бокса, Guava имеет помощники для примитивных массивов, например. Ints.indexOf (int [] array, int target)

Ответ 5

В отличие от С#, где у вас есть Array.indexOf метод, и JavaScript, где у вас есть IndexOf метод, Java API (Array и Arrays классы, в частности) не имеют такой метод.

Этот метод indexOf (вместе со своим дополнением lastIndexOf) определяется в интерфейсе java.util.List. Обратите внимание, что indexOf и lastIndexOf не перегружены и принимают только объект как параметр.

Если ваш массив отсортирован, вам повезло, потому что класс Arrays определяет серию перегрузок метода binarySearch, который найдет индекс элемента, который вы ищете, с наилучшей производительностью (O (log n) вместо O (n), последний из которых можно ожидать от последовательного поиска, выполняемого indexOf). Существует четыре соображения:

  1. Массив должен быть отсортирован либо в натуральном порядке, либо в порядке Компаратора, который вы предоставляете в качестве аргумента, или, по крайней мере, все элементы, которые "меньше", должны находиться перед этим элементом в массиве и всеми элементами, которые "больше чем" ключ должен наступить после этого элемента в массиве;

  2. Тест, который вы обычно делаете с indexOf, чтобы определить, находится ли ключ в массиве (проверьте, не возвращает ли возвращаемое значение -1), с бинарным поиском. Вы должны убедиться, что возвращаемое значение не меньше нуля, поскольку возвращаемое значение указывает, что ключ отсутствует, но индекс, в котором он ожидался бы, если бы он существовал;

  3. Если ваш массив содержит несколько элементов, которые равны ключу, то, что вы получаете из binarySearch, не определено; это отличается от indexOf, который вернет первое вхождение и lastIndexOf, которое вернет последнее вхождение.

  4. Массив логических элементов может быть отсортирован, если он сначала содержит все фальши, а затем все истины, но это не считается. Не существует переопределения метода binarySearch, который принимает массив логических элементов, и вам нужно будет сделать что-то умное, если вы хотите, чтобы производительность O (log n) обнаруживала, где первое значение появляется в массиве, например, используя массив Булевы и константы Boolean.FALSE и Boolean.TRUE.

Если ваш массив не отсортирован и не является примитивным типом, вы можете использовать методы List indexOf и lastIndexOf, вызывая метод asList для java.util.Arrays. Этот метод вернет оболочку интерфейса AbstractList вокруг вашего массива. Это связано с минимальными издержками, поскольку не создает копию массива. Как уже упоминалось, этот метод не перегружен, поэтому он будет работать только с массивами ссылочных типов.

Если ваш массив не отсортирован и тип массива примитивен, вам не повезло с Java API. Создайте собственный цикл for или свой собственный метод статической утилиты, который, безусловно, будет иметь преимущества производительности по сравнению с методом asList, который включает некоторые накладные расходы на создание объекта. В случае, если вы обеспокоены тем, что писать грубую силу для цикла, которая итерации по всем элементам массива не является изящным решением, примите, что это именно то, что делает Java API при вызове indexOf. Вы можете сделать что-то вроде этого:

public static int indexOfIntArray(int[] array, int key) {
    int returnvalue = -1;
    for (int i = 0; i < array.length; ++i) {
        if (key == array[i]) {
            returnvalue = i;
            break;
        }
    }
    return returnvalue;
}

Если вы хотите, чтобы вы не писали свой собственный метод здесь, подумайте о том, чтобы использовать его из структуры разработки, такой как Guava. Там вы можете найти реализацию indexOf и lastIndexOf.

Ответ 6

Java ArrayList имеет метод indexOf. Массивы Java не имеют такого метода.

Ответ 7

Я не помню "indexOf" на массивах, кроме кодирования для себя... хотя вы, вероятно, могли бы использовать один из многих методов java.util.Arrays#binarySearch(...) (см. Arrays javadoc), если ваш массив содержит примитивные типы

Ответ 8

Интерфейс List имеет метод indexOf(), и вы можете получить список из вашего массива с помощью метода Array asList(). Помимо этого, у массива такого метода нет. У него есть метод binarySearch() для отсортированных массивов.

Ответ 9

Массивы сами по себе не имеют этого метода. Однако в списке есть: indexOf

Ответ 10

Вероятно, вы думаете о java.util.ArrayList, а не в массиве.

Ответ 11

В java-массивах нет прямой функции indexOf.

Ответ 12

Ответ Джеффри Хантина - это хорошо, но у него есть некоторые ограничения, если это делается так или иначе...

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

Lists.indexOf(array, x -> item == x); // compare in the way you want

И вот ваше продление

public final class Lists {
    private Lists() {
    }

    public static <T> int indexOf(T[] array, Predicate<T> predicate) {
        for (int i = 0; i < array.length; i++) {
            if (predicate.test(array[i])) return i;
        }
        return -1;
    }

    public static <T> int indexOf(List<T> list, Predicate<T> predicate) {
        for (int i = 0; i < list.size(); i++) {
            if (predicate.test(list.get(i))) return i;
        }
        return -1;
    }

    public interface Predicate<T> {
        boolean test(T t);
    }
}

Ответ 13

Сначала вы можете отсортировать массив, используя:

Arrays.sort(Your_Array_Name);

а затем используйте двоичный поиск, чтобы найти индекс (предположим, что это 'c')

result = Arrays.binarySearch(Your_Array_Name, c);

теперь переменная результата будет содержать индекс символа 'c'.