Java ArrayList二进制搜索(arrayList)

时间:2017-02-13 12:24:59

标签: java arraylist binary-search

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中的数据。

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

任何人都可以给我任何解决方法吗?我可能知道我使用错误的方式来获取数据,但我需要一个指示去。

2 个答案:

答案 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与列表中的特定元素(中间列表)进行比较,您应该将您要查找的值与列表的中间元素进行比较如果它更大或更小。