2

現在、私は高校の12年生で、Javaのプログラミングコースを受講しています。今、明日テストがあり、勉強しようとしています。このテストは実用的なテストであり、プリミティブデータまたはオブジェクトのいずれかを取得し、挿入ソート、選択ソート、およびマージソートを使用して、プリミティブデータ、配列、または配列リストのいずれかにソートする必要があります。今、私はそれをプリミティブデータに打ち負かしています。オブジェクトを配列と配列リストに並べ替えるのに非常に苦労しているだけです。私は配列と配列リストの選択ソートを持っているので、それは私が非常に問題を抱えているマージソートと挿入ソートです。どうすればいいのかわからない。

よろしくお願いします。

質問を簡単にするために、これら2つのクラスをCircleという名前のオブジェクトを並べ替えるために変換する方法を知りたいです。

ここでの私の最初のコードチャンクはランダムな円を取得し、それを他のクラスにフィードして並べ替えます。私の最後のコードブロックはそれをソートします。

package Merge_Sort_Objects_Array;
import java.util.Scanner;
import java.lang.Math;

public class TestSorts {
    public static void displayArray(int[] array){
        for (int i = 0; i < array.length; i++){
            System.out.print(array[i] + " ");
        }
            System.out.println("\n");
        }

        public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int numItems;
        int[] test;

        System.out.print("Enter number of elements: ");
        numItems = input.nextInt();

        /* populate array with random integers */
        test = new int[numItems];
        for (int i=0; i < test.length; i++){
            test[i] = (int)(100 * Math.random());
        }
        System.out.println("Unsorted:");
        displayArray(test);

        mergesort.mergesort(test, 0, test.length - 1);

        System.out.println("Sorted: ");
        displayArray(test);
    }

}





  package Merge_Sort_Objects_Array;

    public class mergesort {

    /**
     * Merges two sorted portion of items array
     * pre: items[start.mid] is sorted.  items[mid+1.end] sorted.  start <= mid <= end
     * post: items[start.end] is sorted
     */

    private static void merge(int[] items, int start, int mid, int end){
            int[] temp = new int[items.length];
            int pos1 = start;
            int pos2 = mid + 1;
            int spot = start;

            while (!(pos1 > mid && pos2 > end)){
                if ((pos1 > mid) || ((pos2 <= end) &&(items[pos2] < items[pos1]))){
                    temp[spot] = items[pos2];
                    pos2 +=1;
                }else{
                    temp[spot] = items[pos1];
                    pos1 += 1;
                }
                spot += 1;
            }
            /* copy values from temp back to items */

            for (int i = start;  i <= end; i++){
                items[i] = temp[i];
            }
    }

    /**
     * mergesort items[start..end]
     * pre: start > 0, end > 0
     * post: items[start..end] is sorted low to high
     */
    public static void mergesort(int[] items, int start, int end){
        if (start < end){
            int mid = (start + end) / 2;
            mergesort(items, start, mid);
            mergesort(items, mid + 1, end);
            merge(items, start, mid, end);
        }
    }
}

それは良いですか?

さて、グレッグ、これが更新されたtestSortsクラスです。今、それらをすべてintではなくCircleに変更しましたが、以前に特定したエラーが発生します。

public class TestSorts {
    public static void displayArray(Circle[] array){
        for (int i = 0; i < array.length; i++){
            System.out.print(array[i] + " ");
        }
            System.out.println("\n");
        }

        public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int numItems;
        Circle[] test;

        System.out.print("Enter number of objects: ");
        numItems = input.nextInt();

        /* populate array with random integers */
        test = new Circle[numItems];
        for (int i=0; i < test.length; i++){
            test[i] = new Circle((int)(10 * Math.random() + 1));
        }
        System.out.println("Unsorted:");
        displayArray(test);

        mergesort.mergesort(test, 0, test.length - 1);

        System.out.println("Sorted: ");
        displayArray(test);
    }

}

それは役に立ちますか?

4

1 に答える 1

1

Circleオブジェクトを処理するために既存の並べ替えコードを変更するには、2つの基本的な操作が必要なようです。

  1. intタイプを変更してCircle、ソートメソッドの配列タイプを入力します(インデックスではなく、配列タイプのみ)。

  2. の代わりに何か意味のあることをしてくださいitems[pos2] < items[pos1](オブジェクトをだけで比較することはできないため<)。おそらく、半径で並べ替えたい円の場合は、そうすることができますitems[pos2].getRadius() < items[pos1].getRadius()。しかし、それはあなた次第です。

ジェネリックプログラミングについてさらに学ぶと、新しいタイプで使用する必要があるたびに変更することなく、既存のコードを適切なタイプのオブジェクトに適用できるようにするためのより良い方法がわかります。

于 2012-05-31T01:02:33.630 に答える