java - 如何定义通用排序类

标签 java sorting generics arraylist comparison

首先我要说的是,这与我正在旁听的一门课的作业有关。我实际上已经有了作业的答案,但我决定进一步帮助自己理解面向对象编程,因为我目前是一名程序员,但我的教育有一些差距,因为我实际上只做了一些大学的高级编程课上,我做的大部分都是汇编和c,这显然是有很大不同的。

无论如何,我必须为家庭作业编写冒泡排序。没问题。但我也在阅读有关泛型的内容,但不太理解它,所以我想为我自己的理解做一个泛型冒泡排序。

据我了解,使用泛型的原因是这样您可以在不同类型的数据上使用相同的泛型类。

在我的 main 方法中,我调用 doBubbleSort 方法并向其发送一个整数数组列表。我希望能够向它发送任何类型的数组列表。

这是我针对泛型更新的气泡排序:

public static<T> ArrayList doBubbleSort(ArrayList<T> arrayList)
{
    boolean wasSwapped;//
    do{
        wasSwapped = false;
        for (int i=1; i<arrayList.size();i++)
        {
            int b = arrayList.get(i-1).compareTo(arrayList.get(i));
            if (b<0)
            {
                int temp = arrayList[i];
                arrayList[i] = arrayList[i-1];
                arrayList[i-1] = temp;
                wasSwapped = true;
            }


        }
    }while (wasSwapped);
    return arrayList;
}

我一生都无法弄清楚如何正确使用比较语句。我目前无法找到符号 - 方法compareTo(T) 。我希望这里有人能给我一个正确的方向。

我也知道在某些时候我必须指定类型。可以在方法调用中执行此操作还是必须在方法本身中执行此操作。我假设我这样调用它 ArrayList al = Sorting.doBubbleSort(al); 如果我想对字符串进行排序,那就是 ArrayList al = Sorting.doBubbleSort(al);

请帮助我进行比较,并让我知道我对泛型的理解在哪里偏离了轨道。 谢谢

感谢您迄今为止提供的所有帮助。我更改了代码以反射(reflect) @LuiggiMendoza 和 @newaccts 建议。经过一番争论后,我让它工作起来了,我想我开始正确地理解它了。唯一的问题是我不知道如何为 temp 声明通用变量。现在我刚刚添加了另一个通用列表,并使用元素 0 进行交换,但这似乎效率很低,所以我想知道您是否可以提出任何建议。

    public static<T extends Comparable<? super T>> List<T> doBubbleSort(List<T> list)
    {
        boolean wasSwapped;
        List<T> temp = new ArrayList<>();
         temp.add(list.get(0));

        do{
            wasSwapped = false;
            for (int i=1; i<list.size();i++)
            {
                int b = list.get(i-1).compareTo(list.get(i));
                temp.set(0,list.get(i));
                if (b>0)
                {    
                    list.set(i,list.get(i-1));//list[i] = list[i-1];
                    list.set(i-1,temp.get(0));//list[i-1] = temp;
                    wasSwapped = true;
                }


            }
        }while (wasSwapped);
        return list;
    }

}

最佳答案

您需要某种方法来比较您的元素。解决这个问题的常见方法是要求他们实现 Comparable :

public static<T extends Comparable<T>> ArrayList<T> doBubbleSort(ArrayList<T> arrayList)

或者甚至更好(针对接口(interface)编码):

public static<T extends Comparable<T>> List<T> doBubbleSort(List<T> list)

另一种方法就像@LuiggiMendoza建议的那样,提供 Comparator进行比较:

public static <T> doBubbleSort(List<T> list, Comparator<T> comparator)

关于java - 如何定义通用排序类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16683532/

相关文章:

整数列表的排序算法

java - 为什么我的应用程序突然停止?

Java 使用compareTo比较两个对象

c# - 为什么 .NET List Sort() 不采用显式声明的委托(delegate)对象?

javascript - Javascript 中的搜索和冒泡排序数组

java - 泛型:类型不适用于参数

generics - XML 注释——如何正确标记 See also 标签?

java - 从传递的参数将对象转换为类

java - RxJava newbee 线程顺序执行中的问题

java - System.out.println 是否违反得墨忒耳定律?