3

这个问题有点长……所以请多多包涵。

我必须转换我书中介绍的用于对数组进行排序的 SelectionSort 方法,并使其具有通用性,以便我可以在其中输入双精度数或整数并使其工作。

它似乎不允许泛型数组,所以我尝试使用 ArrayList。这里的问题是由于 int 和 doubles 现在位于 Integer 和 Double 包装器中,它破坏了 SelectionSort 方法。

我试图修复它,但我没有运气。我将在下面发布原始的 SelectionSort 方法,然后是我正在创建的类和驱动程序。

原始选择排序:

public class SelectionSort {
private int[] data;
private static final Random generator = new Random();

public SelectionSort(int size) {
    data = new int[size];

    for(int i = 0; i < size; i++) {
        data[i] = 10 + generator.nextInt(90);
    }
}

public void sort() {
    int smallest;

    for(int i = 0; i < data.length - 1; i++) {
        smallest = i;

        for(int index = i + 1; index < data.length; index++) {
            if(data[index] < data[smallest]) {
                smallest = index;
            }
        }

        swap(i, smallest);
    }
}

public void swap(int first, int second) {
    int temporary = data[first];
    data[first] = data[second];
    data[second] = temporary;
}

}

我的简单驱动程序:

public class GenericsDriver {

public static void main(String[] args) {

    SelectionSort<Integer> intSort = new SelectionSort<Integer>();

    intSort.AddGrade(100);
    intSort.AddGrade(90);
    intSort.AddGrade(50);
    intSort.AddGrade(80);
    intSort.AddGrade(95);

    intSort.PrintNumbers();

    //sort here

    intSort.PrintNumbers();

    SelectionSort<Double> doubleSort = new SelectionSort<Double>();

    doubleSort.AddGrade(100.1);
    doubleSort.AddGrade(90.4);
    doubleSort.AddGrade(50.7);
    doubleSort.AddGrade(100.2);
    doubleSort.AddGrade(100.5);

    doubleSort.PrintNumbers();

    //sort here

    doubleSort.PrintNumbers();

}

}

新类和我重新利用 SelectionSort 方法的尝试:

import java.util.*;

public class SelectionSort <T> {

private Array<T> numbers;

public SelectionSort() {
    numbers = new ArrayList<T>();
}

public void AddGrade(T number) {
    numbers.add(number);
}

public void PrintNumbers() {
    System.out.println(numbers.toString());

}

public <T extends Comparable<T>> selectionSort() {
    int smallest;

    for(int  i = 0; i < numbers.size(); i++) {
        smallest = i;

        for(int index = i + 1; index < numbers.size(); index++) {
            if(numbers.) {
            //I've tried everything here...
                            //from using number.get(index), and everything else
                            //I could think of
            }
        }
    }
}

public void swap(int first, int second) {

}

}

正如你所看到的......我在我的新班级中没有任何排序或交换的运气。我无法让它工作。我的说明提示我应该在我的排序方法中使用 > ......但没有什么能让我能够使用 .compareTo() 方法。

这是我书中的实际指令:根据图 19.6 和 19.7 的排序程序编写一个通用方法 selectionSort(这就是我上面给出的代码)。编写一个测试程序,输入、排序和输出一个整数数组和一个浮点数组。提示:在方法 selectionSort 的 type-parameter 部分使用 >,以便您可以使用方法 compareTo() 来比较 T 表示的类型的对象。

有人可以在这里给我一些指导吗?谢谢。

4

3 回答 3

1

看来您是泛型的新手。如果您希望程序成为您编写的方式,我可以指出一些错误,您可以改进这些错误,然后尝试运行您的程序。

在您将类定义为的第三个代码清单中

SelectionSort <T>

宣言

private Array<T> numbers; 

不正确,因为您不想要这个 Array 类,您可以改用以下内容:

private List<T> numbers; 

此外,没有必要将新的 selectionSort() 泛型方法声明为

public <T extends Comparable<T>> selectionSort() {

您是否真的希望 Comparable 或其子类成为返回类型?不,您希望将 T 的列表作为选择排序过程的输出返回。

如果您仍有任何疑问,请返回。

乐于帮助达拉姆

于 2012-11-18T03:53:14.930 回答
0

快速浏览一下 javadocs ( http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Double.html ) 表明 Double 实现了 Comparable 接口,这意味着它将有一个compareTo() 方法。

你的书试图强迫你理解的一点是,你可以有多种类型(Integer、Double)来实现相同的接口(Comparable),并且你可以在你的代码中利用它。

所以:

Double firstDouble = Double.valueof(42.0); Double secondDouble = Double.valueof(43.0);

整数 firstInteger = Integer.valueof(42); 整数 secondInteger = Integer.valueof(43);

所以你可以写: firstDouble.compareTo(secondDouble) 和 firstInteger.compareTo(secondInteger) - 但是通过在 Comparable 上实现排序(而不是 Integer、Double 等),你可以使用:

numbers.get(i).compareTo(numbers.get(i+1));

hth

于 2012-11-18T03:42:36.750 回答
0

使用比较器。这个SO 答案有一些细节。您可以使用相同的概念来定义自己的比较器。这样你的排序算法是真正通用的,可以处理任何数据类型(例如复数)

于 2012-11-18T03:44:09.937 回答