Удаление из ObservableList в javafx - PullRequest
       90

Удаление из ObservableList в javafx

0 голосов
/ 23 декабря 2018

У меня есть два ObservableList, один из которых содержит какую-то песню, а другой имеет каталог, связанный с песнями.

Я хочу, чтобы при удалении каталога из его ObservableList все песни, содержащие этот каталог, былиудалены из их ObservableList.но когда я делаю это, только песни с нечетным идентификатором удаляются, а песни с четным идентификатором остаются !!!

мои ObservableLists находятся в другом классе, а «controller» является объектом класса, который содержит ObservableLists.вот мой код:

private static ObservableList<SongModel> songModelObservableList = FXCollections.observableArrayList();
private static ObservableList<Directory_Model> directoryModelObservableList = FXCollections.observableArrayList();

и теперь мой код, который удаляет каталог:

for (int j = 0 ; j < controller.getSongModelObservableList().size() ; j++)
   if (controller.getSongModelObservableList().get(j).getPath().contains(controller.getDirectoryModelObservableList().get(i).getPath())){
         controller.getSongModelObservableList().remove(controller.getSongModelObservableList().get(j));

          }
    controller.getDirectoryModelObservableList().remove(controller.getDirectoryModelObservableList().get(i));

здесь.во-первых, если я проверяю, какой songModel (мой класс для песен) имеет путь к каталогу, чтобы удалить его из songObservableList.

есть какие-нибудь идеи, чтобы это исправить?Я хочу удалить все песни каталога, а не песни с нечетным идентификатором.

1 Ответ

0 голосов
/ 23 декабря 2018

Если вы удалите элемент с индексом j из списка, элемент в позиции j после модификации является элементом, который ранее был с индексом j+1.Поскольку вы увеличиваете индекс после каждой итерации цикла, вы пропускаете элемент, если удаляете его в итерации.Вместо этого только увеличивайте индекс, если ни один элемент не удален:

final String removePath = controller.getDirectoryModelObservableList().get(i).getPath();
for (int j = 0; j < controller.getSongModelObservableList().size();)
   if (controller.getSongModelObservableList().get(j).getPath().contains(removePath)){
       controller.getSongModelObservableList().remove(j);
   } else {
       j++;
   }
}
controller.getDirectoryModelObservableList().remove(i);

Было бы проще, хотя бы просто использовать Predicate с removeIf:

final String removePath = controller.getDirectoryModelObservableList().get(i).getPath();
controller.getSongModelObservableList().removeIf(element -> element.getPath().contains(removePath));
...