【问题标题】:Sorting array for Binary Search二进制搜索的排序数组
【发布时间】:2014-04-20 23:33:44
【问题描述】:

我有一个对象数组(电话目录条目,以 Entry( surname,initials,extension) 的形式存储),我想有效地搜索它们。为了做到这一点,我正在尝试使用Arrays.binarySearch()。我有两种不同的方法来搜索数组,一种使用名称,另一种使用数字。当我在addEntry() 方法中将每个元素插入正确的位置时,该数组按姓氏按字母顺序排序。我可以在按名称搜索时使用binarySearch(),因为数组按字母顺序排序,但我遇到的问题是当我按数字搜索时数组没有排序。我已经在我的 Entry 类中覆盖了 compareTo() 来比较姓氏,但是当我按数字搜索时,我需要按数字升序对数组进行排序,我不确定该怎么做?

public int lookupNumberByName(String surname, String initials) {

    int index = 0;
    if (countElements() == directory.length) {
        Entry lookup = new Entry(surname, initials);
        index = Arrays.binarySearch(directory, lookup);
    }
    else if (countElements() != directory.length) {
        Entry[] origArray = directory;
        Entry[] cutArray = Arrays
                .copyOfRange(directory, 0, countElements());
        directory = cutArray;
        Entry lookup = new Entry(surname, initials);
        index = Arrays.binarySearch(directory, lookup);
        directory = origArray;
    }
    return index;
}

我想为我的 LookupByNumber() 方法做这样的事情 -

public int LookupByNumber(int extension) {
    Entry[] origArray1 = directory;
    Entry[] cutArray1 = Arrays.copyOfRange(directory, 0, countElements());
    directory = cutArray1;
    Arrays.sort(directory); //sort in ascending order of numbers
    Entry lookup1 = new Entry(extension);
    int index1 = Arrays.binarySearch(directory, lookup1);
    String surname1 = directory[index1].getSurname();
    String initals1 = directory[index1].getInitials();
    directory = origArray1;

    int arrayPos = lookupNumberByName(surname1,initials1);

    return arrayPos;

我的compareTo 方法 -

public int compareTo(Entry other) {
    return this.surname.compareTo(other.getSurname());
}

帮助非常感谢

编辑 - 我意识到数组不是最好的数据结构,但我被特别要求使用数组来完成这项任务。

更新 - sort(T[] a, Comparator<? super T> c) 究竟是如何工作的?当我尝试编写自己的 Comparator -

public class numberSorter implements Comparator<Entry> {
@Override
public int compare(Entry o1, Entry o2) {
    if (o1.getExtension() > o2.getExtension()) {
        return 1;
    }
    if (o1.getExtension() == o2.getExtension()) {
        return 0;
    }
    if (o1.getExtension() < o2.getExtension()) {
        return -1;
    }
    return -1;
}
}

然后调用 Arrays.sort(directory,new numberSorter()); 我得到以下异常 -

java.lang.NullPointerException
at java.lang.String.compareTo(Unknown Source)
at project.Entry.compareTo(Entry.java:45)
at project.Entry.compareTo(Entry.java:1)
at java.util.Arrays.binarySearch0(Unknown Source)
at java.util.Arrays.binarySearch(Unknown Source)
at project.ArrayDirectory.LookupByNumber(ArrayDirectory.java:128)
at project.test.main(test.java:29)

我到底做错了什么?

【问题讨论】:

    标签: java arrays performance sorting


    【解决方案1】:

    与其将 Entry 对象保存在 Arrays 中,不如将它们保存在 Maps 中。例如,您将有一个映射将姓氏映射到条目,另一个映射将扩展名映射到条目。然后,您可以通过在适当的 Map 上调用 get() 方法来有效地按姓氏或扩展名查找条目。

    如果 Map 是 TreeMap,则查找的速度与二分查找的速度大致相同 (O log(n))。如果使用 HashMap,一旦获得大量条目,它会更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多