java - 在Java中以通用方式实现comprable方法进行排序

标签 java sorting generics comparable compareto

我正在尝试实现一个通用选择排序,它可以接受任何对象并对其进行排序。我可以向编译器保证,无论我要比较的对象是什么,都已为其实现了compareTo 方法。但我得到以下代码的编译错误

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class SelectionSortGenerics implements Comparable<E> {

    private <E> void swap(E[] a, int i, int j) {
        if (i != j) {
            E temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }

    public <E> void selectionSort(E[] a) {
        for (int i = 0; i < a.length - 1; i++) {
            // find index of smallest element
            int smallest = i;
            for (int j = i + 1; j < a.length; j++) {
                if (a[j].compareTo(a[smallest])<=0) {
                    smallest = j;
                }
            }

            swap(a, i, smallest);  // swap smallest to front
        }
    }

    public static void main(String[] args){
        SelectionSortGenerics firstsort = new SelectionSortGenerics();

        Integer[] arr = {3,4,1,5};
        System.out.println("before sorting int: "+ Arrays.toString(arr));
        firstsort.selectionSort(arr);
        System.out.println("After sorting int : "+Arrays.toString(arr));
         String[] arr1= {"acd","ded","dal","bad","cle"};
         System.out.println("before sorting String: "+ Arrays.toString(arr1));
         firstsort.selectionSort(arr1);
         System.out.println("After sorting String : "+Arrays.toString(arr1));
         Character[] arr2= {'c','e','a','d','c'};
         System.out.println("before sorting char: "+ Arrays.toString(arr2));
         firstsort.selectionSort(arr2);
         System.out.println("After sorting char : "+Arrays.toString(arr2));
    }
}

正如你所看到的,我在 main 方法中传递的对象是 Integer、String 和 Character,它们具有compareTo 方法。如何使上面的代码工作。任何地方都需要类型转换吗? 感谢您的帮助。

最佳答案

以下内容对我有用。我所做的只是删除 <E>在类声明中并更改 <E><E extends Comparable<E>>在选择排序中。

通用<E>在类声明中是不必要的,并且可能会造成混淆,因为您的类实际上不需要是通用的。只有类中的方法是泛型的,类本身不是泛型的。

其次,selectionSort方法要求传入的元素类型与其自身具有可比性。您可以用 E extends Comparable<E> 来表示这一点.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class SelectionSortGenerics {

    private <E> void swap(E[] a, int i, int j) {
        if (i != j) {
            E temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }

    public <E extends Comparable<E>> void selectionSort(E[] a) {
        for (int i = 0; i < a.length - 1; i++) {
            // find index of smallest element
            int smallest = i;
            for (int j = i + 1; j < a.length; j++) {
                if (a[j].compareTo(a[smallest])<=0) {
                    smallest = j;
                }
            }

            swap(a, i, smallest);  // swap smallest to front
        }
    }

    public static void main(String[] args){
        SelectionSortGenerics firstsort = new SelectionSortGenerics();

        Integer[] arr = {3,4,1,5};
        System.out.println("before sorting int: "+ Arrays.toString(arr));
        firstsort.selectionSort(arr);
        System.out.println("After sorting int : "+Arrays.toString(arr));
         String[] arr1= {"acd","ded","dal","bad","cle"};
         System.out.println("before sorting String: "+ Arrays.toString(arr1));
         firstsort.selectionSort(arr1);
         System.out.println("After sorting String : "+Arrays.toString(arr1));
         Character[] arr2= {'c','e','a','d','c'};
         System.out.println("before sorting char: "+ Arrays.toString(arr2));
         firstsort.selectionSort(arr2);
         System.out.println("After sorting char : "+Arrays.toString(arr2));
    }
}

关于java - 在Java中以通用方式实现comprable方法进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284636/

相关文章:

php - 如何查询数据库的中间值并按最接近的排序?

php - 如何按嵌套 php 数组排序

c# - 从通用列表中删除一个元素

Java 泛型 : parse String[] to (T extends Number)[]

java - 在java中合并列表中相似项目的快速方法

java - SWT - 使用浮点坐标和亚像素精度进行绘图

java - 获取 javax.mail.MessagingException : [EOF] on our live server, 但在我们的开发服务器上一切都按预期工作

java - JPanel 在 JScrollPane 中填充了按钮

C qsort 不对多维数组中的最后一项进行排序

java - Java中变量的定义是否缺少 'Diamond operator'?