Java的Array indexOf在哪里?

时间:2011-02-10 20:36:45

标签: java arrays indexof

我必须遗漏一些非常明显的东西,但我已经搜遍了所有这些方法。

13 个答案:

答案 0 :(得分:213)

使用Arrays实用程序类有几种方法可以实现此目的。

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

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

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

如果数组已排序,您可以使用二进制搜索来获得性能:

java.util.Arrays.binarySearch(theArray, o)

答案 1 :(得分:56)

数组没有indexOf()方法。

也许这个Apache Commons Lang ArrayUtils方法正是您正在寻找的方法

import org.apache.commons.lang3.ArrayUtils;

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

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");

答案 2 :(得分:18)

没有。使用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()

从数组中创建一个

答案 3 :(得分:16)

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

答案 4 :(得分:12)

与使用Array.IndexOf方法的C#和使用indexOf方法的JavaScript不同,Java的API(特别是ArrayArrays类)没有这样的方法。

此方法indexOf(及其补码lastIndexOf)在java.util.List接口中定义。请注意,indexOf和lastIndexOf不会重载,只会将Object作为参数。

如果您的数组已排序,那么您很幸运,因为Arrays类定义了binarySearch方法的一系列重载,它们将找到您正在寻找的元素的索引,并获得最佳性能( O(log n)代替O(n),后者是indexOf完成的顺序搜索所能得到的结果。有四个注意事项:

  1. 数组必须按照自然顺序或按照作为参数提供的比较器的顺序进行排序,或者至少所有“小于”键的元素必须位于该元素之前数组和“大于”键的所有元素必须位于数组中的该元素之后;

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

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

  4. 如果一个布尔值首先包含所有的谬误,然后是所有的诅咒,那么它可能会被排序,但这不算数。没有覆盖接受布尔数组的binarySearch方法,如果在检测数组中出现第一个true的位置时想要O(log n)性能,则必须做一些聪明的事情,例如使用数组布尔值和常量Boolean.FALSE和Boolean.TRUE。

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

    如果您的数组未排序且数组的类型是原语,那么您就不熟悉Java API了。编写自己的for循环或自己的静态实用程序方法,这肯定比涉及对象实例化的一些开销的asList方法具有性能优势。如果你担心编写一个循环的暴力迭代遍历数组的所有元素并不是一个优雅的解决方案,那么接受这就是当你调用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的实现。

答案 5 :(得分:10)

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

答案 6 :(得分:6)

我不记得数组上的“indexOf”而不是自己编码...虽然你可以使用众多java.util.Arrays#binarySearch(...)方法中的一种(参见Arrays javadoc)如果你的数组包含基本类型

答案 7 :(得分:5)

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

答案 8 :(得分:4)

数组本身没有那种方法。但是,List会: indexOf

答案 9 :(得分:3)

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

答案 10 :(得分:2)

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

答案 11 :(得分: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);
    }
}

答案 12 :(得分:-4)

int findIndex(int myElement, int[] someArray){
 int index = 0;
 for(int n: someArray){
   if(myElement == n) return index;
   else index++;
 }
}

注意:您可以将此方法用于int类型的数组,您也可以将此算法用于其他类型的微小更改