it-swarm.com.ru

Где Java Array indexOf?

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

160
Jamie

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

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

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

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

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

Java.util.Arrays.binarySearch(theArray, o)
197
Jeffrey Hantin

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

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

import org.Apache.commons.lang3.ArrayUtils;

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

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
52
Kerem Baydoğan

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

18
Matt Ball

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

16
Andrew McKinlay

В отличие от C #, где у вас есть метод Array.IndexOf и JavaScript, где у вас есть метод indexOf , у API Java (в частности, классов 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) при обнаружении, где в массиве появляется первое значение true, например, с использованием массива Логические и константы Boolean.FALSE и Boolean.TRUE.

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

Если ваш массив не отсортирован, а тип массива is primitive, вам не повезло с 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

12
Mishax

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

10
James

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

6
Kellindil

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

5
Mike Yockey

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

4
Igor

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

3
duffymo

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

2
gambo

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

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

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);
    }
}
0
M.kazem Akhgary