224

我一定遗漏了一些非常明显的东西,但是我已经到处搜索了,找不到这种方法。

4

13 回答 13

258

Arrays使用实用程序类有几种方法可以完成此操作。

如果数组未排序且不是基元数组:

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

如果数组原始数组且未排序,则应使用其他答案之一提供的解决方案,例如Kerem Baydoğan'sAndrew McKinlay'sMishax's。即使theArray是原始代码(可能发出警告),上面的代码也会编译,但您仍然会得到完全不正确的结果。

如果数组已排序,则可以使用二进制搜索来提高性能:

java.util.Arrays.binarySearch(theArray, o)
于 2011-02-10T20:40:48.513 回答
71

数组没有indexOf()方法。

也许这个 Apache Commons LangArrayUtils方法就是您正在寻找的

import org.apache.commons.lang3.ArrayUtils;

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

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
于 2011-02-10T20:41:54.277 回答
22

对于基元,如果你想避免装箱,Guava有基元数组的助手,例如Ints.indexOf (int[] array, int target)

于 2011-08-16T19:26:03.633 回答
19

空无一人。使用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()

于 2011-02-10T20:41:02.387 回答
17

与在 C# 中拥有Array.IndexOf方法和在 JavaScript 中拥有indexOf方法不同,Java 的 API(尤其是类ArrayArrays类)没有这样的方法。

这个方法 indexOf(连同它的补充 lastIndexOf)在java.util.List接口中定义。注意 indexOf 和 lastIndexOf 没有重载,只接受一个 Object 作为参数。

如果您的数组已排序,那么您很幸运,因为 Arrays 类定义了 binarySearch 方法的一系列重载,该方法将以最佳性能找到您正在寻找的元素的索引(O(log n) 而不是 O(n ),后者是您可以从 indexOf) 完成的顺序搜索中所期望的。有四个考虑:

  1. 数组必须按自然顺序或您作为参数提供的 Comparator 的顺序排序,或者至少所有“小于”键的元素必须位于数组中的该元素之前,并且所有元素是“大于”键必须在数组中的那个元素之后;

  2. 通常使用 indexOf 进行的测试以确定键是否在数组中(验证返回值是否不是 -1)不适用于 binarySearch。您需要验证返回值是否不小于零,因为返回的值将指示键不存在,但如果它确实存在则预期的索引;

  3. 如果您的数组包含多个等于键的元素,那么您从 binarySearch 获得的内容是未定义的;这与返回第一次出现的 indexOf 和返回最后一次出现的 lastIndexOf 不同。

  4. 如果一个布尔数组首先包含所有假然后所有真,则它可能看起来已排序,但这不算数。没有替代接受布尔数组的 binarySearch 方法,如果在检测第一个 true 出现在数组中的位置时,如果你想要 O(log n) 性能,你必须在那里做一些聪明的事情,例如使用数组布尔值和常量 Boolean.FALSE 和 Boolean.TRUE。

如果您的数组未排序且不是原始类型,则可以通过调用java.util.Arrays的asList方法来使用 List 的 indexOf 和 lastIndexOf 方法。此方法将在您的数组周围返回一个 AbstractList 接口包装器。它涉及最小的开销,因为它不创建数组的副本。如前所述,此方法未重载,因此仅适用于引用类型的数组。

如果您的数组未排序并且数组的类型原始的,那么您对 ​​Java API 不走运。编写您自己的 for 循环或您自己的静态实用程序方法,与涉及对象实例化一些开销的 asList 方法相比,这肯定会具有性能优势。如果您担心编写遍历数组所有元素的强力 for 循环不是一个优雅的解决方案,请接受这正是您调用 indexOf 时 Java API 所做的事情。你可以做这样的事情:

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)的方法。在那里你可以找到indexOflastIndexOf的实现。

于 2013-09-29T23:12:25.100 回答
14

JavaArrayList有一个indexOf方法。Java 数组没有这样的方法。

于 2011-02-10T20:39:18.410 回答
7

除了为自己编码之外,我不记得数组上的“indexOf”...尽管如果您的数组包含原始类型,您可能可以使用许多java.util.Arrays#binarySearch(...)方法之一(请参阅数组 javadoc )

于 2011-02-10T20:40:15.557 回答
5

List 接口有一个 indexOf() 方法,您可以使用 Array 的 asList() 方法从数组中获取一个 List。除此之外,Array 本身没有这样的方法。它确实有一个用于排序数组的 binarySearch() 方法。

于 2011-02-10T20:40:40.090 回答
4

数组本身没有这种方法。然而,列表确实: indexOf

于 2011-02-10T20:40:04.793 回答
3

您可能正在考虑java.util.ArrayList,而不是数组。

于 2011-02-10T20:39:21.340 回答
2

java数组中没有直接的indexOf函数。

于 2016-10-19T02:51:24.810 回答
0

Jeffrey Hantin的回答很好,但它有一些限制,如果它这样做或那样做......

您可以编写自己的扩展方法,它总是按照您想要的方式工作。

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);
    }
}
于 2018-12-02T09:12:37.853 回答
-5
int findIndex(int myElement, int[] someArray){
 int index = 0;
 for(int n: someArray){
   if(myElement == n) return index;
   else index++;
 }
}

注意:您可以将此方法用于 int 类型的数组,您也可以将此算法用于其他类型稍有变化的数组

于 2017-10-14T11:19:18.297 回答