Где Java Array indexOf? - PullRequest
       48

Где Java Array indexOf?

174 голосов
/ 10 февраля 2011

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

Ответы [ 13 ]

213 голосов
/ 10 февраля 2011

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

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

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

Если массив является примитивами и не отсортирован, следует использовать решение, предложенное одним из других ответов, например Керема Байдогана * Эндрю Маккинлея Mishax в . Приведенный выше код будет компилироваться, даже если theArray является примитивным (возможно, с предупреждением), но, тем не менее, вы получите совершенно неверные результаты.

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

java.util.Arrays.binarySearch(theArray, o)
56 голосов
/ 10 февраля 2011

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

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

import org.apache.commons.lang3.ArrayUtils;

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

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
18 голосов
/ 10 февраля 2011

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

16 голосов
/ 16 августа 2011

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

12 голосов
/ 30 сентября 2013

В отличие от 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).Есть четыре соображения:

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

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

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

  4. Может показаться, что массив логических значений отсортирован, если сначала он содержит все ложные значения, а затем всеправда, но это не считается.Нет переопределения метода 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 .

10 голосов
/ 10 февраля 2011

Java ArrayList имеет метод indexOf. В массивах Java такого метода нет.

6 голосов
/ 10 февраля 2011

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

5 голосов
/ 10 февраля 2011

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

4 голосов
/ 10 февраля 2011

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

3 голосов
/ 10 февраля 2011

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

...