我有两个ObservableList,其中一个包含一些歌曲,另一个包含与歌曲相关的目录。
我想从其ObservableList中删除目录时,所有包含该目录的歌曲都将从其ObservableList中删除。 但是当我这样做时,只会删除具有奇数id的歌曲,而保留具有偶数id的歌曲!!!
我的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中删除。
有什么办法解决?我想删除所有目录歌曲,而不是具有奇数id的歌曲。
答案 0 :(得分:0)
如果从列表中删除索引为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));