Где находится массив indexOf Java?

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

12 ответов


есть несколько способов сделать это с помощью Arrays служебный класс.

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

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

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

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

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

может быть, это Apache Commons Lang ArrayUtils метод-это то, что вы ищете

import org.apache.commons.lang3.ArrayUtils;

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

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

нет. Либо используйте 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()


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


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

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

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

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

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

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

  4. массив логических значений может показаться отсортированным, если он сначала содержит все falses, а затем все trues, но это не считается. Нет переопределения метода binarySearch, который принимает массив булевых значений, и вам придется сделать что-то умное, если вы хотите производительность O(log n) при обнаружении, где первое true появляется в массиве, например, используя массив булевых значений и констант булевых.FALSE и Boolean.ИСТИННЫЙ.

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

если Ваш массив не отсортирован и тип массива is первобытное, вам не повезло с API Java. Напишите свой собственный цикл for или свой собственный статический метод утилиты, который, безусловно, будет иметь преимущества по сравнению с подходом asList, который включает некоторые накладные расходы на создание экземпляра объекта. Если вы обеспокоены тем, что запись грубой силы для цикла, который повторяет все элементы массива, не является элегантным решением, примите, что именно это делает API Java при вызове 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.


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


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


интерфейс списка имеет метод indexOf (), и Вы можете получить список из своего массива с помощью метода Aslist() массива. Кроме этого, сам Array не имеет такого метода. Он имеет метод binarySearch () для отсортированных массивов.


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


вы, вероятно, думал о java.утиль.Коллекция ArrayList, а не массив.


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


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

Arrays.sort(Your_Array_Name);

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

result = Arrays.binarySearch(Your_Array_Name, c);

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