【问题标题】:Efficient Java Function to retrieve ID from ordered array从有序数组中检索 ID 的高效 Java 函数
【发布时间】:2011-08-29 00:16:36
【问题描述】:

在 Java 程序中,我有一个对象数组。每个对象都有一个作为 ID 号的字段,并且所有字段都是公共的(没有 getter 和 setter)。该数组按 ID 号排序,ID 号是一个整数。我不想使用 for 循环或类似的技术来遍历每个对象,因为数组可能很大。所以,

  1. 什么搜索算法可以有效地做到这一点,以及...
  2. 是否有一种方便的 Java 方法可以帮我进行此搜索,所以我 不用自己写吗?

【问题讨论】:

  • 这是作业吗?这听起来像是家庭作业。
  • 你为什么不用Map<Integer, Object> 来代替呢?还是必须是数组?

标签: java search


【解决方案1】:

要么使用 java.util.Arrays.binarySearch()(如果它是一个基元数组或者你有一个 Comparator)或 java.util.Collections.binarySearch()(如果你有一个自己的 Comparable 的非数组集合对象)。

听起来 Arrays.binarySearch 更适合您的问题。编写一个正确的 java.util.Comparator 来理解您的排序。

【讨论】:

【解决方案2】:

什么搜索算法

二分查找。

有什么功能可以做到吗?

是的,binarySearch in java.util.Arrays

唯一的问题是您需要编写一个Comparator 来提取id 字段。比如,如果你有一堂课

static class A {
    int id;

    A(int _id) { this.id = _id; }
}

看起来像

Comparator<A> idComp = new Comparator<A>() {
    public int compare(A a1, A a2) {
        return new Integer(a1.id).compareTo(a2.id);
    }

    public boolean equals(A a1, A a2) {
        return a1.id == a2.id;
    }
};

【讨论】:

    【解决方案3】:

    一种方法是获取您的订单数组,然后像二叉树一样搜索它。从中间开始,如果您要查找的数字大于查询的数字,则在 1/2 - 3/4 - 1 部分重复,如果小于,则在 0 - 1/4 - 1/2 部分重复.

    使其递归,并获取数组子集。在第一次调用时,它将是整个数组,在第二次调用时,它将是较高或较低 ID 的一半,而在第三次调用时,它将实际上是原始数组的四分之一......等等。

    【讨论】:

    • Jim,我其实很熟悉那个算法,并考虑过写它。我忘记了,不过它叫什么?
    • 它叫Binary Search,有些人提到了函数和库,但它对于动态编程来说确实很好。祝你的代码好运 =)
    猜你喜欢
    • 2023-03-08
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多