在 main 方法中调用 Comparator 参数

dgl*_*dgl 3 java generics mergesort comparator

我正在实现插入排序方法。这是我的代码的要求。

  1. 方法插入排序是一个不返回任何内容的静态方法。
  2. 它有两个参数:一个泛型数组和一个比较器(泛型)。
  3. 它使用合并排序算法对通用数组进行排序

我的问题是:在 main 方法中调用时,我对 Comparator 参数 c 使用什么?

这是我到目前为止所拥有的,我有一些未实现的方法(合并排序和 isAnagaram)忽略那些

public class Sorting
{
    public static <T extends Comparable<T>> void insertionSort(T[] a, Comparator<T> c)
    {
        for (int i = 0; i < a.length; i++)
        {
            T key = a[i];
            int j;
            for (j = i - 1; j >= 0; j--)
            {
                if (c.compare(a[j], key) <= 0)
                    break;
                a[j + 1] = a[j];
            }

            a[j + 1] = key;
        }
    }

    public static void mergeSort()
    {
        //TODO
    }

    public static boolean isAnagram(String first, String second)
    {
        //TODO
        return false;
    }

    public static void main(String[] args)
    {
        Integer a[] = { 99, 8, 19, 88, 62, 2, 1, 9, 19 };

        // not sure how to pass parameter comparator

        insertionSort(a, null );

        for (int i = 0; i < a.length; i++)
        {
            System.out.print(a[i] + " ");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我环顾了堆栈溢出,并在 Comparator 接口上搜索了很多,但我真的找不到任何需要将通用比较器作为参数传递的方法。有人可以帮助我说出我不理解的内容或指导我走向正确的方向。

Laj*_*pad 7

Comparatorinterface,无法实例化。你需要实施它。有两种实现方法:

  • compare
  • equals

您需要为Integer元素实现它们。像这样:

public class IntegerComparator implements Comparator {

    public int compare(Integer a, Integer b) {
        return a.intValue() - b.intValue();
    }

    public int equals(Object obj) {
        return this.equals(obj);
    }

}
Run Code Online (Sandbox Code Playgroud)

在你中main你这样称呼它:

insertionSort(a, new IntegerComparator );
Run Code Online (Sandbox Code Playgroud)

说明:Comparator是一个interface,因此它不能被实例化。你需要实施它。您有一个Integer要排序的元素数组,因此您可以实现一个Integer Comparator. 该compare方法返回 int 值的减法。如果 a < b,那么它是负数。如果 a == b,则为 0。如果 a > b,则为正。

在这里这里阅读更多。

  • @dgl,您的插入排序获得了一个泛型类型的比较器,但是您必须定义您的比较器,并且目前您无法实现一个比较方法,该方法将使用任何表示成功地比较任何类型的两个元素。有无限的可能性,你无法预先确定它们。您需要为 Integer 实现 Comparator 并将其传递给您的方法,该方法使用 Comparator for Generic 类型(接口),但是当您调用它时,您必须指定类型。我相信这就是为什么这项任务对你来说很难。 (2认同)