搜索数组中元素的索引

时间:2015-02-17 20:01:53

标签: 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;
        }
    }
    return index;
}

但是,有没有更快的方法只使用java.lang包?

4 个答案:

答案 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)

您可以使用上述一行代码。这里也有一些信息。

array.indexOf()

http://www.tutorialspoint.com/java/java_string_indexof.htm