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 中对集合类进行排序有很好的选择。

有两种基本方法可以对满足特定标准的项目进行排序。您可以使用自定义比较器对整个数据集进行排序,首先按标准匹配,然后按其余排序标准匹配。然后您的结果将位于数据的开头,并且您只会显示结果,直到第一个不符合标准的项目。

这样做的好处是它不使用超出存储数据所需的额外空间。

一种更简洁的方法是只复制符合标准的那部分数据,然后对其进行排序。如果数据在列表中而不是数组中,则使用起来也会容易得多,因为您不需要对数据进行两次传递:一次是找出有多少项目符合条件,另一次是过滤掉匹配的项目。(在这两者之间,您将分配一个数组来保存它们。)

假设您的数据在列表中。您可以像这样获得可用的电影:

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 回答