这个问题有点长......请耐心等待。
我必须转换我的书中涵盖的SelectionSort方法,该方法是为了对数组进行排序,并使其成为通用的,这样我就可以输入双精度或整数,并让它工作。
它似乎不允许通用数组,所以我试图使用ArrayList。这里的问题是因为int和double现在是Integer和Double包装器,它会破坏SelectionSort方法。
我试图解决它,但我没有运气。我将在下面发布原始的SelectionSort方法,然后发布我正在创建的类和驱动程序。
Original 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) {
}
}
正如你所看到的......我在新课程中没有任何运气与排序或交换。我无法让它发挥作用。我的说明提示我应该使用&gt;在我的排序方法中...但没有任何东西能让我使用.compareTo()方法。
这是我书中的实际指令: 根据图19.6和19.7的排序程序编写一个通用方法selectionSort(这是我上面给出的代码)。编写一个测试程序,输入,排序和输出一个Integer数组和一个Float数组。提示:使用&gt;在方法selectionSort的类型参数部分中,以便您可以使用方法compareTo()来比较T表示的类型的对象。
有人可以在这里给我一些指导吗?感谢。
答案 0 :(得分:1)
您似乎对仿制药不熟悉。如果你想让程序成为你编写它的方式,我可以指出一些错误,你可以改进,然后尝试运行你的程序。
在第三个代码清单中,您将类定义为
SelectionSort <T>
声明
private Array<T> numbers;
不正确,因为您不需要此Array类,您可以使用以下代码:
private List<T> numbers;
此外,没有必要将新的selectionSort()泛型方法声明为
public <T extends Comparable<T>> selectionSort() {
您是否真的希望Comparable或其子类成为返回类型? 不,您希望将T列表作为选择排序过程的输出返回。
如果您仍有任何疑问,请回来。
乐意帮助 Dharam
答案 1 :(得分:0)
快速查看javadocs(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Double.html)表明Double实现了Comparable接口,这意味着它将具有compareTo()方法。
你的书试图强迫你理解这一点的概念是你可以有多种类型(整数,双)实现相同的界面(可比较),你可以利用它你的代码。
所以:
Double firstDouble = Double.valueof(42.0); Double secondDouble = Double.valueof(43.0);
Integer firstInteger = Integer.valueof(42); 整数secondInteger = Integer.valueof(43);
所以你可以写:firstDouble.compareTo(secondDouble)和firstInteger.compareTo(secondInteger) - 但是通过在Comparable上实现你的排序(而不是Integer,Double等等),你可以使用:
numbers.get(ⅰ).compareTo(numbers.get第(i + 1));
HTH
答案 2 :(得分:0)
使用比较器。 This回答有一些细节。您可以使用相同的概念来定义自己的比较器。这样你的排序算法就是通用的,可以处理任何数据类型(例如复数)