Java 搜索数组中元素的索引
假设我们有一个对象数组,我想在列表中找到一个特定对象的索引,通常我会使用这个方法Java 搜索数组中元素的索引,java,Java,假设我们有一个对象数组,我想在列表中找到一个特定对象的索引,通常我会使用这个方法 public static int findIndex(Object[] arr, Object o) { int index = -1; for (int i = 0; i < arr.length; i++) { if (arr[i].equals(o)) { index = i; break; } }
public static int findIndex(Object[] arr, Object o) {
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals(o)) {
index = i;
break;
}
}
return index;
}
公共静态int-findIndex(对象[]arr,对象o){
int指数=-1;
对于(int i=0;i
但是,是否只有使用
java.lang
包才能更快地实现这一点?如果您希望提高CPU时间的效率,这是最好的。如果您正在寻找更少的代码行,您可以尝试
theIndex = Arrays.asList(arr).indexOf(o);
或者类似的…如果集合是有序的,您可以使用二进制搜索,这是一种非常简单的搜索算法 下面是一个Java示例:
如果你对数据的顺序一无所知,那么就没有更有效的算法了,这是理论上的最优。你可以-使用一些技巧-使它快几个百分点。例如:
- 缓存数组的长度
- 执行立即返回,而不是中断(就性能而言,中断被认为没有那么有效)
- 使用
代替o.equals
。智能编译器可以缓存arr[i].equals
的o
vtable
public static int findIndex(Object[] arr, Object o) {
int n = arr.length;
for (int i = 0; i < n; i++) {
if (o.equals(arr[i])) {
return i;
}
}
return -1;
}
(由于缓存的原因,您首先调用的方法有所不同)。关键是差异并没有那么大,可以通过操作系统调用和其他服务器任务来改变。所以我们可以有把握地说,我们谈论的是毫秒的实际性能差异
但是,如果数据是按顺序排列的,则可以执行
如果要进行多个查找,可以首先在
哈希集中插入元素。这个HashSet
的平均查找次数为O(1)(给定一个好的散列函数)。您可以使用如上所述的一行代码。这里也有一些信息
array.indexOf()
您所说的更有效的方法是什么意思?什么对你有效?Java8中有一个懒惰的评估,但是当我用你的方法对它进行基准测试时,你的方法更快了!感谢查看Java 8中的findfirst,并将其与您的方法进行比较,您可以看到您的方法比我测试的更快。您可以用更少的行来完成,但不会更快,除非您对数组内容有所了解。有许多搜索算法,但它们都有自己的假设。例如,如果要对列表进行排序,可以使用bisection.OP来搜索数组,而不是字符串。此链接没有解释使用了什么方法以及如何将其用于数组。@Pshemo抱歉,我读得太快了。说到HashSet,还值得一提的是,如果速度是一个主要问题,那么使用java.lang以外的任何包都可以轻松地开发出相当健壮和高效的哈希表结构。其中一个例子来自《算法》第四版。它导入LinkedList包,但只是作为一种惰性方法,将密钥集作为iterable返回。您可以轻松地创建自己的实现iterable接口的极简通用队列。
//question first
findIndex (question): 4s 209 469 827
findIndex (answer): 4s 078 955 465
//answer first
findIndex (question): 4s 256 345 171
findIndex (answer): 4s 488 112 895