如何使用java更新和删除多值数组列表中的元素/项列表?
这是一个示例代码,如何使用java更新和删除多值数组列表中的元素/项列表?,java,arraylist,crud,Java,Arraylist,Crud,这是一个示例代码, *ArrayList<Movie> list = new ArrayList<Movie>(); list.add(new Movie("Force Awakens", 8.3, 2015)); list.add(new Movie("Star Wars", 8.7, 1977)); list.add(new Movie("Empire
*ArrayList<Movie> list = new ArrayList<Movie>();
list.add(new Movie("Force Awakens", 8.3, 2015));
list.add(new Movie("Star Wars", 8.7, 1977));
list.add(new Movie("Empire Strikes Back", 8.8, 1980));
list.add(new Movie("Return of the Jedi", 8.4, 1983));*
/* etc.... */
*for (Movie empl :list) {
System.out.println(empl);
}*
*ArrayList list=new ArrayList();
添加(新片《原力觉醒》,2015年3月8日);
添加(新电影《星球大战》,1977年7月8日);
新增(新片《帝国反击战》,1980年8月8日);
添加(新电影《绝地归来》,1983年4月8日)*
/*等等*/
*对于(电影员工:列表){
系统输出打印项次(emp);
}*
我的数组列表类似于(控制台中的输出(eclipse)):
电影[评级=8.7,名字=星球大战,年份=1977]
电影[评级=8.8,名字=帝国反击战,年份=1980]
电影[评级=8.4,名字=绝地归来,年份=1983]
电影[评级=8.3,名字=力量觉醒,年份=2015]
所以我的问题是如何使用java从列表中更新和删除上述任何一项。我应该在这里应用什么逻辑。?
p.S:我尝试了java remove()命令,但在下面引发了一个异常:
线程“main”java.util.ConcurrentModificationException中出现异常
在
java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:937)
位于java.base/java.util.ArrayList$Itr.next(ArrayList.java:891)
MainModule.main(MainModule.java:45)
当一个对象在不允许的情况下试图同时修改时,会出现ConcurrentModificationException。当使用Java集合类(在您的示例中是ArrayList)时,通常会出现此异常 1-使用
Collections.synchronizedList()
获取列表的线程安全版本:
List<Movie> list = Collections.synchronizedList(yourMoviesArray);
2-使用ArrayList的线程安全变体是CopyOnWriteArrayList
CopyOnWriteArrayList<Movie> list = new CopyOnWriteArrayList<>();
list.add(); // add all your movies just like you add in a normal list
// conditional remove elemnts
list.forEach(e -> {
if (shouldRemove(e))
list.remove(e);
});
CopyOnWriteArrayList list=new CopyOnWriteArrayList();
list.add();//像添加普通列表一样添加所有电影
//条件删除元素
列表。forEach(e->{
如果(应删除(e))
删除(e);
});
您也可以尝试使用lambda表达式
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Movie {
private String name;
private Double rate;
private Integer year;
}
class MovieCRUD{
@试验
公共测试(){
ArrayList=新建ArrayList();
添加(新片《原力觉醒》,2015年3月8日);
添加(新电影《星球大战》,1977年7月8日);
新增(新片《帝国反击战》,1980年8月8日);
添加(新电影《绝地归来》,1983年4月8日);
/*相当于删除星球大战*/
List newList=List.stream()
.filter(movie->!movie.getName().equals(“星球大战”))
.collect(Collectors.toList());//只保留条件返回true的元素
/*
*电影(名称=力量觉醒,商店=8.3,年份=2015)
*电影(名称=帝国反击,商店=8.8,年份=1980)
*电影(名字=绝地归来,商店=8.4,年份=1983)
*/
forEach(System.out::println);
}
@试验
公共void updateTest(){
ArrayList=新建ArrayList();
添加(新片《原力觉醒》,2015年3月8日);
添加(新电影《星球大战》,1977年7月8日);
新增(新片《帝国反击战》,1980年8月8日);
添加(新电影《绝地归来》,1983年4月8日);
List newList=List.stream()
.map(movie->movie.getRate()==8.8?movie.setRate(7.8):movie
.collect(Collectors.toList());
/*
*
*电影(名称=力量觉醒,商店=8.3,年份=2015)
*电影(名称=星球大战,商店=8.7,年份=1977)
*电影(名称=帝国反击,商店=7.8,年份=1980)//更新了电影的收视率
*电影(名字=绝地归来,商店=8.4,年份=1983)
*/
forEach(System.out::println);
}
}
Lambda表达式对于过滤集合或数组中的数据非常有用
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Movie {
private String name;
private Double rate;
private Integer year;
}
class MovieCRUD {
@Test
public void deleteTest() {
ArrayList<Movie> list = new ArrayList<Movie>();
list.add(new Movie("Force Awakens", 8.3, 2015));
list.add(new Movie("Star Wars", 8.7, 1977));
list.add(new Movie("Empire Strikes Back", 8.8, 1980));
list.add(new Movie("Return of the Jedi", 8.4, 1983));
/*Equivalent to deleting star wars*/
List<Movie> newList = list.stream()
.filter(movie -> !movie.getName().equals("Star Wars"))
.collect(Collectors.toList());//Only elements whose condition returns true will be retained
/*
* Movie(name=Force Awakens, store=8.3, year=2015)
* Movie(name=Empire Strikes Back, store=8.8, year=1980)
* Movie(name=Return of the Jedi, store=8.4, year=1983)
*/
newList.forEach(System.out::println);
}
@Test
public void updateTest() {
ArrayList<Movie> list = new ArrayList<Movie>();
list.add(new Movie("Force Awakens", 8.3, 2015));
list.add(new Movie("Star Wars", 8.7, 1977));
list.add(new Movie("Empire Strikes Back", 8.8, 1980));
list.add(new Movie("Return of the Jedi", 8.4, 1983));
List<Object> newList = list.stream()
.map(movie -> movie.getRate() == 8.8 ? movie.setRate(7.8) : movie)
.collect(Collectors.toList());
/*
*
* Movie(name=Force Awakens, store=8.3, year=2015)
* Movie(name=Star Wars, store=8.7, year=1977)
* Movie(name=Empire Strikes Back, store=7.8, year=1980) //Updated the movie's ratings
* Movie(name=Return of the Jedi, store=8.4, year=1983)
*/
newList.forEach(System.out::println);
}
}