3

この質問はちょっと長いので、ご容赦ください。

配列をソートするために構築された私の本で説明されている 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;
}

}

私の単純なドライバープログラム:

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 の sort プログラムに基づいてジェネリック メソッド selectionSort を書きます (これが上で示したコードです)。Integer 配列と Float 配列を入力、並べ替え、出力するテスト プログラムを作成します。ヒント: メソッド selectionSort の型パラメータ セクションで > を使用すると、メソッド compareTo() を使用して、T が表す型のオブジェクトを比較できます。

誰かがここで私にいくつかのガイダンスを教えてもらえますか? ありがとう。

4

3 に答える 3

1

あなたはジェネリックに不慣れなようです。プログラムを自分の書いたとおりにしたい場合は、いくつかの間違いを指摘できます。それを改善して、プログラムを実行してみてください。

クラスを次のように定義した3番目のコードリスト

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()メソッド。

あなたの本があなたに頭を悩ませようとしているポイントは、同じインターフェース(Comparable)を実装する複数のタイプ(Integer、Double)を持つことができ、それをコードで利用できるという概念です。

それで:

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 に答える