假设我们有一个对象数组,我想在列表中找到特定对象的索引,一般情况下我会使用方法
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;
}
但是,有没有更快的方法只使用java.lang
包?
答案 0 :(得分:2)
如果您对数据顺序一无所知,那么就没有更高效的算法,这是理论上的最佳选择。你可以 - 使用一些技巧 - 使它快几个百分点。例如:
break
(当涉及到性能时,休息时间被视为效率不高)。o.equals
代替arr[i].equals
。智能编译器可以缓存vtable
的{{1}}。但很可能编译器已经可以自己推导出一些优化。
因此,更有效的算法可能是:
o
虽然差别不会那么大。如果两个tests实现,则不同之处是:
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;
}
(由于缓存,您首先调用的方法有所不同)。重点是差异不是那么大,可以通过OS调用,其他服务器任务来改变。所以我们可以肯定地说我们谈论的是实际性能差异的毫秒数。
如果数据有序(按某种顺序关系),您可以执行binary search。
如果您想要进行多次查找,可以先在//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
中插入元素。此HashSet<T>
平均查找 O(1)(给定良好的散列函数)。
答案 1 :(得分:1)
如果您正在寻找CPU时间的效率,那么它就会得到很好的效果。如果您正在寻找更少的代码行,可以尝试
theIndex = Arrays.asList(arr).indexOf(o);
或类似......
答案 2 :(得分:0)
如果订购了该集合,您可以使用二分搜索,这是一种相当简单的搜索算法。
http://en.wikipedia.org/wiki/Binary_search_algorithm
这是一个Java示例:
http://www.programmingsimplified.com/java/source-code/java-program-for-binary-search
答案 3 :(得分:-1)