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



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

574   12  

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 (the Array и Arrays классы в частности) не имеют такого метода.

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

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

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

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

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

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

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

если Ваш массив не отсортирован и тип массива и первобытное, вам не повезло с Java API. Напишите свой собственный цикл 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;
}

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

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

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

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

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

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

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

вы можете сначала отсортировать массив с помощью :

Arrays.sort(Your_Array_Name);

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

result = Arrays.binarySearch(Your_Array_Name, c);

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

Comments

    Ничего не найдено.