2012-06-06 26 views
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); 

      } 

     } 
+2

請刪除所有不是直接與代碼**相關的代碼。見[SSCCE](http://sscce.org) – Bohemian

+1

將所有可用的電影添加到一個新的列表,排序並顯示一個? –

+0

你如何向用戶顯示信息?請注意,['JTable'](http://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html)具有[set](http://docs.oracle.com)的內置功能.com/javase/7/docs/api/javax/swing/JTable.html#setRowSorter%28javax.swing.RowSorter%29)a ['DefaultRowSorter'](http://docs.oracle.com/javase/7/ docs/api/javax/swing/DefaultRowSorter.html)也可以篩選條目。 –

回答

0
+2

這實際上並不會從列表中刪除已租借的電影。 –

+0

比較器用於此目的,請查看http://www.digizol.org/2008/07/java-sorting-comparator-vs-comparable。html,你可以得到提示 –

+0

糾正上面的鏈接:http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html – lkamal

3

首先,你不應該有代碼的混合模型(數據)工作與UI代碼。

其次,你不應該排序UI線程上的數據。在後臺工作線程上完成這項工作。

第三,你不應該自己編碼,特別是不要那樣。你的排序是O(n^2)。在java.util.Arrays中爲數組或集合類的java.util.Collections進行排序有很好的選擇。

有兩種基本的方法可以對僅滿足特定標準的項目進行排序。您可以使用自定義比較器對整個數據集進行排序,首先按照標準匹配,然後按排序標準的其餘部分匹配。然後,您的結果將在數據的開始處,並且只有在第一個項目不符合標準時纔會顯示結果。

這樣做的好處是它不會超出存儲數據所需的額外空間。

一個更簡潔的方法是製作符合條件的那部分數據的副本,然後對其進行排序。如果數據在List中而不是數組中,那麼處理數據也會容易得多,因爲您不需要對數據進行兩次傳遞:一次找出有多少項匹配條件,一次是過濾掉匹配項目。 (在兩者之間,您將分配一個數組來保存它們。)

假設您的數據在列表中。你可以得到可用的電影是這樣的:

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

附註:

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; 
} 

然後,您可以這些電影(在它們的自然排序)這樣的排序在Java 8中,您可以執行如下操作:

Iterable<Movie> avail = movies.filter(Movie::isAvailable).sorted(); 
+0

好的答案,upvoted。然而,關於上面的'第三',我想OP可能有一個學校任務來學習編寫排序算法。這是一個緩慢的算法是另一回事。 –

+0

完全可能。 –