【问题标题】:Java ArrayList binary search ( arrayList)Java ArrayList 二分查找(arrayList)
【发布时间】:2017-02-14 14:40:45
【问题描述】:
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,如果没有找到search,我应该返回false
但是我无法从ArrayList 检索信息。

这里有两个错误。

一个在

search == students.getTotal(i)

另一个在

students.compareTo(students.get(mid))

对于第一个我应该访问students 并比较i 进行搜索,但我无法检索students 中的数据。

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

谁能告诉我如何解决这个问题?我可能知道我使用了错误的方式来获取数据,但我需要一个方向。

【问题讨论】:

  • 1) ArrayList 没有 getTotal 方法
  • 我的学生班有一个 getTotal 是不是无法调用它?
  • Java BinarySearch的可能重复
  • 尝试从学生数组列表中的适当索引处获取学生对象。

标签: java arraylist binary-search


【解决方案1】:

首先我认为是 mid=(first+last)/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 的ArrayList 元素,您希望将其与mid 元素进行比较。
您犯的错误是您将整个列表 students 与列表的特定元素(中间元素)进行比较,您应该将您要查找的值与列表的中间元素进行比较,看看它是否更大或更小。

【讨论】:

  • 欢迎来到 Stack Overflow!我冒昧地编辑了您的答案;你可以在code markdown 中放置变量名,方法是在它们周围加上反引号。无论如何,你得到了正确的答案 - OP 混淆了列表和各个元素。
  • 我去二进制搜索的所有网站都是 mid = first + (last - first) / 2;有没有我可以查看将数组转换为数组列表的网站?
【解决方案2】:

TL;DR: 问题在于您混淆了 ArrayList students 及其成员。
您将方法应用于 students,即 ArrayList,您应该将其应用于其各个成员。

更深入的解释:

@Darshan 在 cmets 中指出,ArrayList 没有方法 getTotal。即使这样,这段代码也总是返回相同的值。

你可能是说

search == students.get(i).getTotal()  

这需要i-th 学生,并将getTotal() 应用于Student 的该实例。返回该特定学生的 getTotal 结果。

你在第二部分基本上犯了同样的错误:

students.compareTo(students.get(mid)) < 0)

在这里,您再次使用 ArrayList students 并尝试将方法应用于 ArrayList,而不是应用于单个学生。

解决方案再次:从列表中取出特定学生(学生#i,由students.get(i) 标识,并对其应用compareTo 方法。

ArrayLists 的官方文档是here

【讨论】:

  • 我仍然收到“方法 elementAt(int) 未定义类型 ArrayList”的错误,我可以阅读任何网站来调用元素吗?
  • @POH 我的错,在 ArrayLists 中它被称为 get。请参阅official documentation for ArrayList。我已经更新了答案。
  • 我尝试了您对“students.compareTo(students.get(mid))”的编码,但它不是您给我的文档的一部分,也没有任何方法可以比较两个字符串是否有替代方案我可以遵循的方法
  • @POH 该文档适用于 ArrayLists。 ArrayList 是一个容器,它包含元素。有点像孩子的玩具盒:你可以用盒子做事(移动它,把它堆在另一个盒子上,推它……)而不用关心里面到底有哪些玩具。或者,你可以从中取出一个玩具,然后用那个玩具做点什么。同样,您有一个学生的 ArrayList。 get 从列表中获取单个学生。然后你需要找到对 Student 类进行操作的操作。顺便说一句,java 字符串的文档是 here.
猜你喜欢
  • 2014-12-11
  • 2016-03-02
  • 2013-03-06
  • 2015-05-10
  • 2016-03-19
  • 2013-10-12
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
相关资源
最近更新 更多