Binary Search of array of objects
本问题已经有最佳答案,请猛点这里访问。
我得到了一些代码,其中包含一组Person对象,我要编写方法来执行二进制搜索,并重写Person类中的CompareTo方法,以便根据姓氏和名字进行比较。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public static int binarySearch( Person[] persons, Person key ) { int low = 0; int high = persons.length - 1; return binarySearch(persons, key, low, high); } private static int binarySearch( Person[]persons, Person key, int low, int high ) { if(low > high) //The list has been exhausted without a match. return -low - 1; int mid = (low + high) / 2; if (persons[mid] == key) return mid; if(persons[mid] < key) //!!**'The < operator is undefined for the type' return binarySearch(persons, key, low, mid-1); else return binarySearch(persons, key, 0, persons.length -1); } |
我想我写的大部分二进制搜索代码。但是,我遇到的问题是,如果(persons[mid] 我想这可能与我的CompareTo方法有关,但我似乎无法解决它。 这是比较表供参考。
1 2 3 4 5 6 7 8 | public int compareTo( Object o ) { Person p = (Person) o; int d = getLastName().compareTo(p.getLastName()); if (d == 0) d = getFirstName().compareTo(p.getFirstName()); return d; } |
谢谢你的帮助!
试试这个:
1 2 3 4 5 6 7 | int mid = (low + high) / 2; if (persons[mid].compareTo(key) == 0) return mid; if(persons[mid].compareTo(key) < 0) return binarySearch(persons, key, low, mid-1); else return binarySearch(persons, key, 0, persons.length -1); |
不能使用类
而不是
1 | if(persons[mid] < key) |
使用
1 | if(persons[mid].compareTo(key) < 0) |
您正在比较两个对象引用,它们只包含指向实际Person对象位置的位模式。对于对象比较,需要定义要比较的属性(属性)。试试这个
1 2 3 | if (persons[mid].compareTo(key) == 0) return mid; if(persons[mid].compareTo(key) < 0) |
还要检查binarysearch的正确实现。
1 2 3 | return binarySearch(persons, key, mid +1, high); else return binarySearch(persons, key, low, mid -1); |
你在你的房间里没有用过这个。应该是这样的
1 2 3 4 5 6 7 8 | public int compareTo( Object o ) { Person p = (Person) o; int d = this.getLastName().compareTo(p.getLastName()); if (d == 0) d = this.getFirstName().compareTo(p.getFirstName()); return d; } |
您的人员数组是否也排序?