0

クラスdvdの配列(dArray)内のすべての映画を並べ替えるメソッドがあります。今、私は利用可能な映画をソートする必要があります(setAvailable == true)のみ。配列は、メニューから映画を入力する顧客によって動的に入力されます。私のコードは現在、配列を検索してすべての映画をAからBに並べ替えていますが、d.setAvailable(true)...の映画だけを検索して並べ替えたいと思っています。ご協力いただきありがとうございます。とても有難い

配列内のすべての映画のソートされたリストは次のとおりです。

if(e.getSource() == sortMovBtn)
        {
            if(dArray[0]==null)
            {
                JOptionPane.showMessageDialog(null,"No movies, please enter\na movie from the main menu","Error",JOptionPane.ERROR_MESSAGE);
            }

            else
            {
                BtnPanel.setVisible(false);
                imgPnl.setVisible(false);
                btnBackDvd.setVisible(true);
                txtAreaSortDvd.setVisible(true);
                sortDvdPnl.setVisible(true);
                Dvd tmp;

                for (int i = 0; i < manyDvd; i++)
                {
                    for (int j = 0; j < (manyDvd - 1 - i); j++)
                    {
                        if (dArray[j].getTitle().compareTo(dArray[j+1].getTitle()) > 0)
                        {
                            tmp = dArray[j];
                            dArray[j] = dArray[j+1];
                            dArray[j+1] = tmp;
                        }
                    }
                }
                a = "";
                for (int k = 0; k <manyDvd /*dArray.length*/; k++)
                    a += (dArray[k]);
                txtAreaSortDvd.setText(a);
                txtAreaSortDvd.setVisible(true);
                txtAreaSortDvd.setEditable(false);

                //Set font of text area
                txtAreaSortDvd.setFont(new Font("Arial", Font.BOLD, 12));

                //Initialize JScrollPane
                JScrollPane pane1 = new JScrollPane(txtAreaSortDvd);

                //Enable user to use wheel on mouse to scroll
                pane1.setWheelScrollingEnabled(true);

                //Set the scrollbar to always show
                pane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

                //Add ScrollPane to Panel
                sortDvdPnl.add(pane1);

                //Add panel to frame
                add(sortDvdPnl);

            }

        }
4

2 に答える 2

3

まず、UIコードと混合されたモデル(データ)を操作するためのコードを用意しないでください。

次に、UIスレッドでデータを並べ替えないでください。バックグラウンドワーカースレッドで作業を行います。

第三に、特にそのように、自分でソートをコーディングするべきではありません。あなたのソートはO(n ^ 2)です。配列の場合はjava.util.Arraysで、コレクションクラスの場合はjava.util.Collectionsで並べ替えるのに適したオプションがあります。

特定の基準を満たすアイテムだけを並べ替えるには、2つの基本的な方法があります。カスタムコンパレータを使用してデータセット全体を並べ替えることができます。最初に基準で照合し、次に残りの並べ替え基準で照合します。その場合、結果はデー​​タの先頭になり、基準を満たさない最初の項目までの結果のみが表示されます。

これには、データの保存にすでに必要なスペースを超える余分なスペースを使用しないという利点があります。

よりクリーンな方法は、基準を満たすデータのその部分だけのコピーを作成し、それを並べ替えることです。また、データが配列ではなくリストにある場合は、データを2回パスする必要がないため、操作がはるかに簡単になります。1つは基準に一致するアイテムの数を確認するためのもので、もう1つは一致するアイテム。(その間に、それらを保持するために配列を割り当てます。)

データがリストにあるとします。あなたはこのような利用可能な映画を手に入れることができます:

public List<Movie> getAvailable(List<Movie> movies) {
    List<Movie> avail = new ArrayList<Movie>();
    for (Movie movie : movies) {
        if (movie.isAvailable()) {
            avail.add(movie);
        }
    }
    return avail;
}

次に、これらの映画を次のように(自然順で)並べ替えることができます。

List<Movie> availOnly = getAvailable(movies);
Collections.sort(availOnly);

PS Java 8では、次のようなことができます。

Iterable<Movie> avail = movies.filter(Movie::isAvailable).sorted();
于 2012-06-06T06:26:52.610 に答える
0

コンパレータを使用するhttp://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

于 2012-06-06T06:13:52.130 に答える