Java's数组indexOf在哪里?

我一定是错过了一些非常明显的东西,但我已经搜索了所有,不能找到这个方法。

345244 次浏览

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

你可能想到的是java.util.ArrayList,而不是数组。

数组本身没有这个方法。然而,A List做到了: indexOf < / p >

我不记得在数组上有一个“indexOf”,除了为自己编写它…不过,如果数组包含基元类型,则可以使用众多java.util.Arrays#binarySearch(...)方法中的一个(参见数组javadoc)

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

使用Arrays实用工具类有几种方法可以实现这一点。

如果数组没有排序,并且< em > < / em >不是是一个原语数组:

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

如果数组原语未排序,则应使用由其他答案之一提供的解决方案,如Kerem Baydoğ的安德鲁·McKinlay的Mishax的。即使theArray是基本的(可能发出警告),上面的代码也会被编译,但你仍然会得到完全不正确的结果。

如果数组是排序的,你可以使用二进制搜索性能:

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

没有。要么使用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()从数组中创建一个

数组没有indexOf()方法。

也许这个Apache Commons Lang ArrayUtils方法就是你要找的

import org.apache.commons.lang3.ArrayUtils;


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


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

对于原语数组,如果你想避免装箱,番石榴为原语数组提供了帮助,例如Ints.indexOf(int[] array, int target)

与c#中有数组中。IndexOf方法和JavaScript中有indexOf方法不同,Java的API(特别是ArrayArrays类)没有这样的方法。

这个方法indexOf(以及它的补码lastIndexOf)在并不知道接口中定义。注意,indexOf和lastIndexOf不是重载的,它们只接受一个Object作为参数。

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

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

  2. 通常使用indexOf来确定数组中是否有键(验证返回值是否为-1)的测试在binarySearch中不成立。您需要验证返回值不小于零,因为返回值将表明键不存在,但如果它存在,则它将被期望的索引;

  3. 如果你的数组包含多个等于键的元素,你从binarySearch得到的是未定义的;this不同于indexOf,后者将返回第一个事件,lastIndexOf将返回最后一个事件。

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

如果你的数组没有排序,也不是基本类型,你可以通过调用java.util.Arrays的asList方法来使用List的indexOf和lastIndexOf方法。该方法将返回围绕数组的AbstractList接口包装器。它涉及的开销最小,因为它不创建数组的副本。如上所述,此方法没有重载,因此只对引用类型的数组有效。

如果你的数组没有排序,并且数组的类型是原语,你是倒霉的Java API。编写您自己的for循环,或者您自己的静态实用程序方法,这肯定比asList方法具有性能优势,因为asList方法涉及对象实例化的一些开销。如果您担心编写一个暴力的for循环来遍历数组的所有元素并不是一个优雅的解决方案,请接受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这样的开发框架的方法。在那里你可以找到indexOflastIndexOf的实现。

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

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

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

Jeffrey Hantin的答案很好,但它有一些限制,如果它是this做这个或else做那个…

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

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