我的方法可以对类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);
}
}
答案 0 :(得分:3)
首先,您不应该使用代码来处理与UI代码混合的模型(数据)。
其次,您不应该在UI线程上对数据进行排序。在后台工作线程上完成工作。
第三,你不应该自己编码,尤其不是那样。你的排序是O(n ^ 2)。对于数组,可以在java.util.Arrays中进行排序,对于集合类,可以选择java.util.Collections进行排序。
有两种基本方法可以只对符合特定条件的项目进行排序。您可以使用自定义Comparator对整个数据集进行排序,首先按标准进行匹配,然后按其他排序条件进行匹配。然后您的结果将在数据的开头,并且您只会显示结果,直到第一个项目不符合标准。
这样做的好处是它不会占用存储数据所需的额外空间。
更简洁的方法是复制只满足标准的那部分数据,然后对其进行排序。如果数据在List而不是数组中,那么使用它也会容易得多,因为您不需要对数据进行两次传递:一次查找符合条件的项目数量,另一项过滤掉数据匹配项目。 (在两者之间,你会分配一个数组来保存它们。)
假设您的数据位于列表中。你可以得到这样的电影:
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);
P.S。在Java 8中,您将能够执行以下操作:
Iterable<Movie> avail = movies.filter(Movie::isAvailable).sorted();
答案 1 :(得分:0)