2012-06-06 2 views
0

У меня есть метод, который сортирует все фильмы в массиве (dArray) класса dvd. теперь мне нужно сортировать доступные фильмы (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/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

использование компаратор http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

+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.

Во-вторых, вы не должны сортировать данные по потоку пользовательского интерфейса. Выполняйте работу над фоновым рабочим потоком.

В-третьих, вы не должны кодировать сортировку самостоятельно, особенно не так. Ваш тип 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); 

P.S. В Java 8 вы сможете сделать что-то вроде:

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

Хороший ответ, поддержанный. Однако о «третьем» выше я предполагаю, что ОП может иметь школьное задание, чтобы узнать о написании алгоритмов сортировки. То, что это медленный алгоритм, - это другое. –

+0

Вполне возможно. –

Смежные вопросы