我有一个对象数组(电话目录条目,以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)
我究竟做错了什么?
答案 0 :(得分:2)
不要将Entry对象保留在Arrays中,而是将它们保存在Maps中。例如,您有一个Map将Surname映射到Entry,另一个映射将Extension扩展到Entry。然后,您可以通过在相应的Map上调用get()方法,通过Surname或Extension有效地查找条目。
如果Map是TreeMap,则查找速度与二进制搜索速度大致相同(O log(n))。如果使用HashMap,一旦获得大量条目,它就会更快。