Java的Array indexOf在哪里?

问题描述 投票:172回答:13

我必须遗漏一些非常明显的东西,但我已经遍地搜索过,找不到这种方法。

java arrays indexof
13个回答
213
投票

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

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

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

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

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

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

3
投票

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


2
投票

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


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);
    }
}

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

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


56
投票

数组没有indexOf()方法。

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

import org.apache.commons.lang3.ArrayUtils;

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

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

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()从阵列制作一个


16
投票

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


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。

如果您的数组未排序而不是基本类型,则可以通过调用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的实现。


10
投票

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


6
投票

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


5
投票

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


4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.