我有一个对象数组,该对象包含数据成员,如GoalsFor,GoalsAgainst和MatchPoints。现在我使用二进制搜索方法搜索并显示数据,用于给定的GoalFor或goalsAgainst或MatchPoints值。 我正在创建一个二进制搜索类来进行搜索操作,但是目前我必须为三个操作中的每个对象的数据成员创建一个二进制搜索类。有一种方法可以重用二进制搜索代码而不是复制它三次。
这是一个家庭作业的问题,但我认为我的怀疑更为笼统。 约束:不允许线性搜索,除了i / o之外没有内置函数
public class BinarySearchPoints
{
public static void search(Teams arr[], int searchValue, int start , int end)
{
if(start > end)
return;
int mid = (end + start ) / 2;
if(searchValue == arr[mid].points)
{
System.out.print(arr[mid].toString());
search(arr, searchValue, mid + 1, end);
search(arr, searchValue, start, mid - 1);
}
else if(searchValue < arr[mid].points)
{
search(arr, searchValue, mid + 1, end);
}
else
search(arr, searchValue, start, mid - 1);
}
}
我在二进制搜索的其他实现中唯一改变的是使用goalFor和Goals而不是点
答案 0 :(得分:0)
你绝对可以推广你的二元搜索方法。
要做的第一件事是从传递给它的数据集合中考虑二进制搜索需要什么。事实证明,它唯一需要的是能够将数据元素与搜索值进行比较。
接下来要想出一种以抽象方式表达比较的方法,例如:作为一个界面。您的界面将有一个方法来回答问题&#34;元素X
在哪里与给定的数字相关&#34;?
您可以在Java中将其表达为通用接口:
interface ElementComparator<E> {
// This assumes that you always search for an int property
int compare(E element, int value);
}
如果E
属性小于V
,则比较方法需要返回负值,如果大于V
,则需要返回正值,如果两个是平等的。 V
必须实现Comparable
界面。
现在,您的binarySearch
方法可以定义如下:
T binarySearch<E>(
Collection<E> data
, int value
, ElementComparator<E> comparator
) {
...
}
要决定是向左还是向左,你需要拨打comparator.compare(data.get(mid), value);
并检查结果。
现在你可以这样打电话给你binarySearch
:
List<Teams> list = ...
Teams fivePoints = binarySearch(list, 5, new ElementComparator<Teams>() {
public int compare(Teams element, int value) {
return Integer.compare(element.points, value);
}
});
Teams fiveAgainst = binarySearch(list, 5, new ElementComparator<Teams>() {
public int compare(Teams element, int value) {
return Integer.compare(element.against, value);
}
});
请注意比较回调是如何与调用内联提供的:这是神奇发生的地方 - 当binarySearch
实现想要将Team
与value
进行比较时,它会调用{{1 }},反过来调用compare
或Integer.compare
上的element.points
,具体取决于回调。