В отличие от C #, где у вас есть метод Array.IndexOf , и JavaScript, где у вас есть метод indexOf , API-интерфейс Java (особенно классы Array
и Arrays
)) нет такого метода.
Этот метод indexOf (вместе с его дополнением lastIndexOf) определен в интерфейсе java.util.List .Обратите внимание, что indexOf и lastIndexOf не перегружены и принимают только Object в качестве параметра.
Если ваш массив отсортирован , вам повезло, потому что класс Arrays определяет серию перегрузокМетод binarySearch, который найдет индекс элемента, который вы ищете, с наилучшей возможной производительностью (O (log n) вместо O (n), последний - это то, что вы можете ожидать от последовательного поиска, выполняемого indexOf).Есть четыре соображения:
Массив должен быть отсортирован либо в естественном порядке, либо в порядке компаратора, который вы предоставляете в качестве аргумента, или, по крайней мере, всех элементов, которые "меньше, чем «ключ должен предшествовать этому элементу в массиве, а все элементы, которые« больше, чем »ключ, должны идти после этого элемента в массиве;
Тест, который вы обычно делаете»с помощью indexOf для определения того, находится ли ключ в массиве (проверьте, не является ли возвращаемое значение -1), не выполняется с двоичным поиском.Необходимо убедиться, что возвращаемое значение не меньше нуля, поскольку возвращаемое значение будет означать, что ключ отсутствует, но индекс, по которому его можно было бы ожидать, если бы он существовал;
Если ваш массив содержит несколько элементов, которые равны ключу, то, что вы получаете из binarySearch, не определено;это отличается от indexOf, который будет возвращать первое вхождение, и lastIndexOf, который будет возвращать последнее вхождение.
Может показаться, что массив логических значений отсортирован, если сначала он содержит все ложные значения, а затем всеправда, но это не считается.Нет переопределения метода binarySearch, который принимает массив с логическими значениями, и вам придется делать что-то умное, если вы хотите производительность O (log n) при обнаружении, где в массиве появляется первое значение true, например, с использованием массиваBoolean и константы Boolean.FALSE и Boolean.TRUE.
Если ваш массив не отсортирован и не имеет примитивного типа , вы можете использовать методы ListOf и lastIndexOf в List с помощьювызывая 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 .