0

いくつかのショーの名前、日付、時刻を入力するコードを作成しました。日付と名前で並べ替え (バブル ソート) するオプションがあります。私は1.4.2を使用しています(必要があるため)、単純なクラスとともにArrayListを使用しています。

私はこれを何時間も見つめていましたが、何度も立ち去って戻ってきましたが、残念ながら機能していません! 理由はわかりますか?これが私のコードです:

//method to sort and display info
public static void sortDay(){          
    for(int i = 0; i < show.size() - 1; i++) {
        for(int j = 0; j < show.size() - 1; j++){
            showInfo current = (showInfo)show.get(j);
            showInfo next = (showInfo)show.get(j+1);

            if (current.day.compareTo(next.day) < 0) {
                showInfo temp = new showInfo();
                temp.name = ((showInfo)show.get(j)).name;
                temp.day = ((showInfo)show.get(j)).day;
                temp.time = ((showInfo)show.get(j)).time;

                ((showInfo)show.get(j)).time = ((showInfo)show.get(i)).time;
                ((showInfo)show.get(j)).day = ((showInfo)show.get(i)).day;
                ((showInfo)show.get(j)).name = ((showInfo)show.get(i)).name;

                ((showInfo)show.get(i)).time = temp.time;
                ((showInfo)show.get(i)).day = temp.day;
                ((showInfo)show.get(i)).name = temp.name;
            }
        } 
    }
    System.out.println("Show Information");
    for (int i = 0; i < show.size(); i++){
        System.out.println("Name: " + ((showInfo)show.get(i)).name);
        System.out.println("Day: " + ((showInfo)show.get(i)).day);
        System.out.println("Time: " + ((showInfo)show.get(i)).time);
    }       
}     

どんな助けでも素晴らしいでしょう!前もって感謝します!

4

4 に答える 4

0

どのように修正しますか?

私はあなたの質問に答えているだけです:あなたが投稿したコードを修正する方法. 「どうすれば改善できますか?」については、他のすべての回答は、私が思いつくよりもはるかに優れています。

次の 2 つのポイントがあります。

  • 内側の同じインデックスでスワップfor(index j)
  • 正しいスワッピング:書き込みがある場所とj書き込みがある場所j+1ij
  • もう1つforは、最悪の場合にソートするのに十分な回数反復するためです(他の回答の提案はwhile、はるかに優れています)

そうは言っても、スワッピングの擬似コードは次のとおりです。

if (show[j] < show[j+1]) {
    temp = j+1
    j+1 = j
    j = temp
}

そして、これが修正を含むスワッピングコードです:

        if (current.day.compareTo(next.day) < 0) {
            showInfo temp = new showInfo();
            temp.name = ((showInfo)show.get(j+1)).name;
            temp.day = ((showInfo)show.get(j+1)).day;
            temp.time = ((showInfo)show.get(j+1)).time;

            ((showInfo)show.get(j+1)).time = ((showInfo)show.get(j)).time;
            ((showInfo)show.get(j+1)).day = ((showInfo)show.get(j)).day;
            ((showInfo)show.get(j+1)).name = ((showInfo)show.get(j)).name;

            ((showInfo)show.get(j)).time = temp.time;
            ((showInfo)show.get(j)).day = temp.day;
            ((showInfo)show.get(j)).name = temp.name;
        }

そして、ここに印刷された結果があります(day - time - name各ショーを想定しているため、最初のintでソートしています):

Show Information before sort
610 - -72 - 1402
838 - -184 - 1096
-478 - 248 - 934
709 - 832 - -590
2007 - 954 - -315
Show Information after sort
2007 - 954 - -315
838 - -184 - 1096
709 - 832 - -590
610 - -72 - 1402
-478 - 248 - 934
于 2016-12-21T14:37:55.890 に答える
0

まず、あなたがある種のものを使用していると仮定しますList- おそらくArrayList.

とはいえ、バブルソートの主な操作は次のとおりです。

  • 比較して注文する
  • 一時変数の作成
  • 左の値を一時変数に入れる
  • 右の値を左の値に配置
  • 古い左の値を一時的な値から右の値に配置します

フィールドをシャッフルしているため、混乱やバグが発生します。代わりに上記の方法を使用してください。

ここでは、ジェネリクス (キャストする必要がないため) と大文字のクラス名を使用して説明しています。への参照が既にあるため、この例には一時変数はありませんcurrent

List<ShowInfo> show = new ArrayList<>(); // assume populated

public static void sortDay(){
    for(int i = 0; i < show.size(); i++) {
        for(int j = 0; j < show.size() && j != i; j++) {
            ShowInfo current = show.get(i);
            ShowInfo next = show.get(j);

            // If the current day is greater than the next day, we need to swap.
            // Adjust to suit your business logic (if current is less than next).
            if (current.day.compareTo(next.day) > 0) {
                show.set(i, next);
                show.set(j, current);
            }
        }
    }
}
于 2013-11-04T03:15:18.603 に答える
0

これを行う一般的な方法として、おそらく次のようなことを試すことができます。

public static <T extends Comparable> void sort(final List<T> list){
    boolean remaining;
    do{
        remaining = false;
        for(int i = 0; i < list.size()-1; i++){
            final T current = list.get(i);
            final T next = list.get(i+1);
            if(current.compareTo(next) < 0){
                list.set(i, next);
                list.set(i+1, current);
                remaining = true;
            }
        }
    }while(remaining);
}
于 2013-11-04T03:37:24.160 に答える
-3
public class myBubbleSort
{
    private static int[] a;

    public static void main(String[] args)
    {
        getArray(10);
        System.out.println("Array before sorting");
        printArray();
        ascendingBubble();
        System.out.println("Array after ascending sort");
        printArray();
        descendingBubble();
        System.out.println("Array after descending sort");
        printArray();

        System.out.println();
        System.out.println("Random sort");
        getArray(10);
        bubbleSort(true);
        System.out.println("Array after Random sort");
        printArray();
    }

    // print the number in random array
    public static void printArray()
    {
        for (int i : a)
        {
            System.out.print(i + " ");
        }
        System.out.println();
    }

    // generate a random array to be sorted in ascending and descending order
    public static void getArray(int size)
    {
        a = new int[size];
        int item = 0;
        for (int i = 0; i < size; i++)
        {
            item = (int) (Math.random() * 100);
            a[i] = item;
        }
    }

    // sort getArray in ascending order and bubblesort it
    public static void ascendingBubble()
    {
        int temp;
        System.out.println();
        System.out.println("Ascending sort");
        for (int i = 0; i < a.length - 1; i++)
        {
            for (int j = 0; j < a.length - 1; j++)
            {
                if (a[j] > a[j + 1])
                {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }

        bubbleSort(true);
    }

    // sort getArray in descending order and bubblesort it
    public static void descendingBubble()
    {
        int temp;
        System.out.println();
        System.out.println("Descending sort");

        for (int i = 0; i < a.length - 1; i++)
        {
            for (int j = 0; j < a.length - 1; j++)
            {
                if (a[j] < a[j + 1])
                {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }

        bubbleSort(true);
    }

    // bubble sort algorithm
    public static void bubbleSort(boolean printTime)
    {
        boolean sorted = false;
        int pass = 1;
        int temp;
        long startTime;
        long endTime;
        long duration;

        startTime = System.nanoTime();
        while (pass < a.length - 1 && (!sorted))
        {
            sorted = true;
            for (int i = 0; i < a.length - 1; i++)
            {
                if (a[i] > a[i + 1])
                {
                    temp = a[i];
                    a[i] = a[i + 1];
                    a[i + 1] = temp;
                    sorted = false;
                }
            }
            pass = pass + 1;
        }
        endTime = System.nanoTime();
        duration = (endTime - startTime);
        if(printTime)
        {
            System.out.println(duration + " "+ " nano seconds");
        }
    }

}
于 2014-12-15T14:13:06.073 に答える