我必须遗漏一些非常明显的东西,但我已经遍地搜索过,找不到这种方法。
使用Arrays
实用程序类有两种方法可以实现此目的。
如果数组未排序且不是基元数组:
java.util.Arrays.asList(theArray).indexOf(o)
如果数组是基元而未排序,则应使用其他答案之一提供的解决方案,例如Kerem Baydoğan's,Andrew McKinlay's或Mishax's。即使theArray
是原始的(可能发出警告),上面的代码也会编译,但是你会得到完全错误的结果。
如果数组已排序,您可以使用二进制搜索来获得性能:
java.util.Arrays.binarySearch(theArray, o)
你可能正在考虑java.util.ArrayList,而不是数组。
java数组中没有直接的indexOf函数。
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);
}
}
int findIndex(int myElement, int[] someArray){
int index = 0;
for(int n: someArray){
if(myElement == n) return index;
else index++;
}
}
注意:您可以将此方法用于int类型的数组,您也可以将此算法用于其他类型的微小更改
数组没有indexOf()
方法。
也许这个Apache Commons Lang ArrayUtils
方法正是您所寻找的
import org.apache.commons.lang3.ArrayUtils;
String[] colours = { "Red", "Orange", "Yellow", "Green" };
int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
空无一人。要么使用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()
从阵列制作一个
对于基元,如果你想避免装箱,Guava有原始数组的助手,例如Ints.indexOf(int [] array,int target)
与使用Array.IndexOf方法的C#和使用indexOf方法的JavaScript不同,Java的API(特别是Array
和Arrays
类)没有这样的方法。
此方法indexOf(连同其补码lastIndexOf)在java.util.List接口中定义。请注意,indexOf和lastIndexOf不会重载,只将Object作为参数。
如果您的数组已经排序,那么您很幸运,因为Arrays类定义了binarySearch方法的一系列重载,它将找到您正在寻找的元素的索引,具有最佳性能(O(log n)而不是O(n ),后者是你对indexOf完成的顺序搜索所期望的。有四个注意事项:
如果您的数组未排序而不是基本类型,则可以通过调用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这样的开发框架中的方法。在那里你可以找到indexOf和lastIndexOf的实现。
Java ArrayList
有一个indexOf
方法。 Java数组没有这样的方法。
我不记得阵列上的“indexOf”而不是自己编码...虽然你可以使用众多java.util.Arrays#binarySearch(...)
方法中的一种(参见Arrays javadoc),如果你的数组包含原始类型
List接口有一个indexOf()方法,您可以使用Array的asList()方法从数组中获取List。除此之外,Array本身没有这样的方法。它对排序数组有一个binarySearch()方法。
数组本身没有这种方法。但是,List会这样做:indexOf