2017-02-13 68 views
-1
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; 
} 

在这种方法,我认为,如果search发现返回true,并false如果search没有找到。
但是我无法从ArrayList检索信息。Java的ArrayList的二进制搜索(ArrayList的)

这里有两个错误。

一个在

search == students.getTotal(i) 

另一个在

students.compareTo(students.get(mid)) 

对于第一个我应该访问students和比较i搜索,但我无法在students检索数据。

在第二个我应该得到如果搜索继续在左或右侧。

任何人都可以给我任何提示如何解决这个问题?我可能知道我使用错误的方式获取数据,但我需要一个指导。

+4

1)ArrayList没有getTotal方法 – Darshan

+0

我有一个getTotal在我的学生类中不能调用它吗? – POH

+0

[Java BinarySearch]的可能重复(http://stackoverflow.com/questions/12517764/java-binarysearch) –

回答

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) 

在这里,你又拿的ArrayListstudents和尝试的方法应用到ArrayList,而不是个别学生。

其解决方法还是:。采取从列表(学生#I,由students.get(i)确定的特定学生,并应用compareTo方法到

为的ArrayList的官方文档是here

+0

我仍然得到一个错误“方法elementAt(int)是未定义的类型ArrayList ” 是否有任何网站我可以读取元素的调用? – POH

+0

@POH我的不好,在ArrayLists中它被称为'get'。请参阅[ArrayList的官方文档](https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)。我已经更新了答案。 –

+0

我试过你的编码为“students.compareTo(students.get(mid))” ,但它不是你给我的文档的一部分,并且没有任何方法来比较两个字符串是否有另一种方法,我可以遵循 – POH

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你得到的ArrayList在特定位置处i要比较的mid元素只是元素。
您所犯的错误是您将整个列表students与列表中的特定元素(中间的那个)进行比较,您应该在其中比较您正在查找的值与列表中的中间元素以查看它是更大还是更小。

+0

欢迎来到堆栈溢出!我冒昧编辑你的答案;你可以在'code markdown'中放置变量名称。无论如何,你已经得到了正确的答案--OP将混淆列表和单个元素。 –

+0

我去找的二进制搜索的所有网站都是 mid = first +(last - first)/ 2; 有没有任何网站可以查看转换数组为ArrayList? – POH