public static boolean binarySearch(ArrayList<Student> students, int search) {
int first = 0;
int last = students.size() - 1;
int mid;
while (first <= last) {
mid = first + (last - first) / 2;
if (search == students.getTotal(i)) {
return true;
} else if (students.compareTo(students.get(mid)) < 0) {
last = mid - 1;
} else {
first = mid + 1;
}
}
return false;
}
在此方法中,如果找到true
,我应该返回search
,如果找不到false
则返回search
。
但是,我无法从ArrayList
检索信息。
这里有两个错误。
一个在
search == students.getTotal(i)
另一个
students.compareTo(students.get(mid))
对于第一个,我应该访问students
并将i
与搜索进行比较,但我无法检索students
中的数据。
如果搜索要在左侧或右侧继续进行,我应该得到第二个。
任何人都可以给我任何解决方法吗?我可能知道我使用错误的方式来获取数据,但我需要一个指示去。
答案 0 :(得分:1)
TL; DR:问题是您混淆了ArrayList students
及其成员。
您可以将方法应用于您应该应用于其各个成员的students
,即ArrayList。
更深入的解释:
正如@Darshan在评论中指出的那样,ArrayList
没有方法getTotal
。即使这样,这段代码也会返回相同的值。
你可能意味着
search == students.get(i).getTotal()
这会吸引i
名学生,并将getTotal()
应用于Student
的该实例。返回该特定学生的getTotal
结果。
你在第二部分中犯了同样的错误:
students.compareTo(students.get(mid)) < 0)
在这里,您再次使用 ArrayList students
并尝试将方法应用于ArrayList,而不是单个学生。
解决方法是:从列表中选择特定的学生(学生#i,由students.get(i)
标识,并应用compareTo
方法。
ArrayLists的官方文档是here。
答案 1 :(得分:1)
首先,我认为它的中期=(第一个+最后一个)/ 2个。
其次,我会使用数组,因为它更容易。但是如果您特别想使用ArrayList,那么您可以执行以下操作:
public static boolean binarySearch(ArrayList<Student> students, int search) {
int first = 0;
int last = students.size() - 1;
int mid;
while (first <= last) {
mid = ( first + last ) / 2;
if (search == students.get(i)) {
return true;
} else if (search.compareTo(students.get(mid)) > 0) {
last = mid - 1;
} else {
first = mid + 1;
}
}
return false;
}
说明:使用ArrayList.get
,您只能获得要与i
元素进行比较的特定位置mid
的ArrayList元素。
您犯的错误是您将整个列表students
与列表中的特定元素(中间列表)进行比较,您应该将您要查找的值与列表的中间元素进行比较如果它更大或更小。