如何定义泛型排序类

时间:2013-05-22 04:35:59

标签: java sorting generics arraylist comparison

首先请允许我说这与我正在选修的课程的作业有关。我实际上已经有了家庭作业的答案,但我决定更进一步,以帮助自己理解面向对象的编程,因为我目前作为程序员工作,但我的教育有一些空白,因为我实际上只做了一些大学里的高级编程课程,我所做的大部分是汇编和c,这显然是很不一样的。

无论如何,我必须为家庭作业写一个泡泡排序。没问题。但是我也在阅读有关泛型的内容并且不太了解它,所以我想根据自己的理解制作一个通用的bubblesort。

根据我的理解,使用泛型的原因是你可以在不同类型的数据上使用相同的泛型类。

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

以下是针对泛型更新的气泡排序:

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;
}

我不能为我的生活弄清楚如何正确使用compare语句。我目前正在找不到符号 - 方法compareTo(T)。我希望这里有人可以给我一个正确方向的推动。

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

请通过我的比较帮助我,让我知道我对Generics的理解已脱离了轨道。 感谢

到目前为止,感谢您的帮助。我已经更改了我的代码以反映@LuiggiMendoza和@newaccts建议。经过多次争吵后,我开始工作了,我想我已经开始理解它了。唯一的问题是我无法弄清楚如何为temp声明一个通用变量。现在我刚刚添加了另一个通用List,并使用元素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;
    }

}

1 个答案:

答案 0 :(得分:4)

您需要一些方法来比较您的元素。解决此问题的常见方法是要求他们实施Comparable

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

甚至更好(针对界面编码):

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

另一种方式是@LuiggiMendoza建议,提供Comparator进行比较:

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