Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将此排序方法转换为Java中的通用方法?_Java_Generics_Sorting - Fatal编程技术网

如何将此排序方法转换为Java中的通用方法?

如何将此排序方法转换为Java中的通用方法?,java,generics,sorting,Java,Generics,Sorting,这个问题有点长。。。所以请容忍我 我必须转换我的书中介绍的SelectionSort方法,该方法用于对数组进行排序,并使其成为通用方法,以便我可以在其中输入double或int,并使其正常工作 它似乎不允许泛型数组,所以我尝试使用ArrayList。这里的问题是,由于int和Double现在在Integer和Double包装中,因此它破坏了SelectionSort方法 我试着把它修好,但运气不好。我将在下面发布最初的SelectionSort方法,然后是我正在创建的类和驱动程序 原始选择排序:

这个问题有点长。。。所以请容忍我

我必须转换我的书中介绍的SelectionSort方法,该方法用于对数组进行排序,并使其成为通用方法,以便我可以在其中输入double或int,并使其正常工作

它似乎不允许泛型数组,所以我尝试使用ArrayList。这里的问题是,由于int和Double现在在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;
}

}
公共类选择排序{
私有int[]数据;
专用静态最终随机生成器=新随机();
公共选择排序(整数大小){
数据=新整数[大小];
对于(int i=0;i
我的简单驱动程序:

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();

}

}
公共类GenericsDriver{
公共静态void main(字符串[]args){
SelectionSort intSort=新建SelectionSort();
intSort.AddGrade(100);
intSort.AddGrade(90);
intSort.AddGrade(50);
intSort.AddGrade(80);
intSort.AddGrade(95);
intSort.printNumber();
//在这里分类
intSort.printNumber();
SelectionSort doubleSort=新建SelectionSort();
双重排序。添加等级(100.1);
双重排序。添加等级(90.4);
双重排序。添加等级(50.7);
双重排序。添加等级(100.2);
双重排序。添加等级(100.5);
doubleSort.printNumber();
//在这里分类
doubleSort.printNumber();
}
}
新类和我重新调整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) {

}

}
import java.util.*;
公共类选择排序{
专用数组号;
公共选择排序(){
数字=新的ArrayList();
}
公共等级(T编号){
数字。添加(数字);
}
公共数字(){
System.out.println(numbers.toString());
}
公共选择排序(){
int最小;
对于(int i=0;i
正如你所看到的。。。在我的新班级里,我在排序或交换方面没有任何运气。我不能让它工作。我的指令提示我应该在排序方法中使用>,但没有任何东西能让我使用.compareTo()方法

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


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

快速浏览一下javadocs()就会发现Double实现了可比较的接口,这意味着它将有一个compareTo()方法

您的书试图迫使您了解的一点是,您可以有多个类型(Integer、Double)来实现相同的接口(Comparable),并且您可以在代码中利用这些类型

因此:

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

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

因此,您可以编写:firstDouble.compareTo(secondDouble)和firstInteger.compareTo(secondInteger)-但是通过对Comparable(而不是Integer、Double等)实现排序,您可以使用:

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


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

似乎您对泛型还不熟悉。如果您希望程序按照您编写的方式运行,我可以指出一些错误,您可以改进这些错误,然后尝试运行您的程序

在第三个代码列表中,您将类定义为

SelectionSort <T>
SelectionSort
宣言

private Array<T> numbers; 
私有数组号;
不正确,因为您不需要此数组类,您可以改为使用以下内容:

private List<T> numbers; 
私有列表编号;
另外,将新的selectionSort()泛型方法声明为

public <T extends Comparable<T>> selectionSort() {
公共选择排序(){
您真的希望类似的或其子类成为返回类型吗? 否,您希望T的列表作为选择排序过程的输出返回

如果你还有任何疑问,请回来

很乐意帮忙 达拉姆