当前位置: 首页 > 知识库问答 >
问题:

无法将数组和比较器作为泛型类型传递

萧自珍
2023-03-14

我对泛型类型有点无知,希望得到一些澄清。在我Java的教科书中,为我们提供了一个mergesort程序:

import java.util.Comparator;

public class mergeSortBook{
    public static<K>void merge(K[] S1,K[] S2,K[] S,Comparator<K>comp){
        int i=0,j=0;
        while(i+j<S.length) {
            if(j==S2.length || (i<S1.length && comp.compare(S1[i],S2[j])<0))
                S[i+j]=S1[i++];
            else 
                S[i+j]=S2[j++];
        }
    }
    public static<K>void mergeSort(K[] S,Comparator<K>comp){
        int n=S.length;
        if (n<2) return;
        int mid = n/2;
        K[] S1 = Arrays.copyOfRange(S, 0, mid);
        K[] S2 = Arrays.copyOfRange(S, mid, n);
        mergeSort(S1,comp);
        mergeSort(S2,comp);
        merge(S1,S2,S,comp);
    }
}

我正在尝试实现上述算法。经过一些研究,我决定实例化一个默认比较器,并将其传递给mergeSort()函数。然而,我在尝试传入数组时遇到了问题。Eclipse IDE中的错误是mergeSort(K[],Comparator)方法

下面是我的main方法和DefaultComparator方法的代码。如果您能给我一些提示,告诉我如何传递正确类型的参数,让程序正常运行,我将不胜感激。

    public class DefaultComparator<E> implements Comparator<E> 
    {
        @Override
        public int compare(E a, E b) throws ClassCastException {
            return ((Comparable<E>) a).compareTo(b);
        }
    }
    public static void main(String args[]) {

        int arr[] = {3,1,6,2,4,8,9,2,1};
        mergeSort(arr,new DefaultComparator<Integer>());
    }

共有2个答案

孟光耀
2023-03-14

您不能使用泛型方法对int[]进行排序。只有引用类型适用于泛型,例如intger[]

Integer arr[] = {3,1,6,2,4,8,9,2,1};
mergeSort(arr,new DefaultComparator<Integer>());
后凯捷
2023-03-14

您需要整数才能使用泛型方法(int是基本类型,而不是可比较的)。您也可以使用比较器。naturalOrder()。喜欢

public static void main(String args[]) {
    Integer[] arr = { 3, 1, 6, 2, 4, 8, 9, 2, 1 };
    mergeSort(arr, Comparator.naturalOrder());
    System.out.println(Arrays.toString(arr));
}

输出

[1, 1, 2, 2, 3, 4, 6, 8, 9]

最后,代替比较器

public static <K> void merge(K[] left, K[] right, K[] arr, Comparator<? super K> comp) {
    int i = 0, j = 0;
    while (i + j < arr.length) {
        if (j == right.length || (i<left.length && comp.compare(left[i], right[j])<0)) {
            arr[i + j] = left[i++];
        } else {
            arr[i + j] = right[j++];
        }
    }
}

如果你想把你的声明放在一行上,请保持一致。喜欢

public static <K> void mergeSort(K[] arr, Comparator<? super K> comp) {
    int n = arr.length, mid = n / 2;
    if (n < 2) {
        return;
    }
    K[] left = Arrays.copyOfRange(arr, 0, mid), right = Arrays.copyOfRange(arr, mid, n);
    mergeSort(left, comp);
    mergeSort(right, comp);
    merge(left, right, arr, comp);
}
 类似资料:
  • 问题内容: 在Java中,我编写了一个Binary Search Tree类,该类使用递归添加节点。现在,我想使用泛型对其进行概括,以便我可以了解更多有关它们的信息。 我添加节点的功能在以下类中 主类具有以下代码来开始工作。我正在使用字符串,但是数据类型可能是一些复杂的类型。 我开始使用Comparable接口,但是如何编写CompareTo()函数?我不知道T是什么类型的?我得到的错误是“运算符

  • 我写了以下方法 我如何将不同的枚举类型传递给第二个参数?我知道我不能创建枚举的实例,但初始化枚举意味着我将传递一个值,而不是整个初始化的枚举,如下所示...其他枚举也将传递给相同的方法以实现组合细节

  • 问题内容: 问题摘要: 我想将具有类型参数(例如)的类作为类型参数传递给泛型方法。 假设我有一个方法: 当然,此方法对于任何类型的类都可以正常使用。我可以这样调用该方法,例如: 问题: 我发现我不能这样做: 从句法上讲,这显然是无效的。但是,我不确定如何实现这样的目标。我当然可以通过,但是泛型类型的添加使其在语法上不再有效,并且我想不出解决方法。 唯一的直接解决方案是这样的事情(看起来很愚蠢):

  • 我想说得具体一点。我有一个名为Result的类和一个名为Result的派生类 这些类在方法中用作返回类型。为此,我创建了这个helper类: 正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返

  • 问题内容: 我正在为核心数据编写通用包装类。 这是我的一些基本类型。没什么特别的。 我已经将我的coredata写在协议中抽象化了。如果您让我知道您对我要提出的抽象的意见,我将不胜感激。但是在扩展中,我遇到了以下错误: 无法将类型“ NSFetchRequest”的值转换为预期的参数类型“ NSFetchRequest <_>” 不确定我该如何解决。我尝试了各种更改代码的尝试,但未成功…… 另外,

  • 我正在创建一个由数组支持的泛型类型堆栈。当我尝试创建泛型类型数组时,Java不允许我这样做。有人告诉我,我必须创建一个类型为Object的数组,并将其转换为泛型类型。我已经将对象数组转换为类型,但如何处理Java不断给我的未检查类型错误? 这就是我目前所处的位置。 更新:我正在创建一个对象数组,然后在方法的末尾将返回类型转换为T类型。