【问题标题】:How to reuse this code instead of copying and pasting it again and again如何重用这段代码,而不是一次又一次地复制和粘贴
【发布时间】:2015-09-11 12:25:58
【问题描述】:

我有一个对象数组,该对象包含数据成员,例如GoalsFor、GoalsAgainst 和 MatchPoints。现在,我使用二分搜索方法对给定的goalsFor 或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);

  }
}

我在其他二分搜索实现中唯一改变的是使用goalsFor 和Goals against 而不是点

【问题讨论】:

  • 您可以将二进制搜索逻辑实现为 java 函数,然后多次调用该函数
  • 你能展示这个被复制三次的代码吗?
  • 请发布一份您的二进制搜索代码,以便更容易解释需要更改的内容。
  • 简短回答:是的。更长的答案:魔鬼在细节中;代码的细节将决定抽象它的方法。您可能还想查看Comparator 界面。
  • 您可能需要考虑binarySearch 的非递归实现,它更具可读性。

标签: java arrays class object code-reuse


【解决方案1】:

你绝对可以概括你的二分搜索方法。

首先要做的是从传递给它的数据集合中考虑您的二分搜索需要什么。事实证明,它唯一需要的是将数据元素与搜索值进行比较的能力。

接下来的事情是想出一种以抽象方式表达比较的方法,例如作为接口。您的界面将有一个方法来回答“元素X 相对于给定数字在哪里”这个问题?

您可以在 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 实现想要将Teamvalue 进行比较时,它调用compare,而后者又调用@ element.pointselement.against 上的 987654337@,具体取决于回调。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2020-01-10
    • 2017-11-22
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多