Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用java更新和删除多值数组列表中的元素/项列表?_Java_Arraylist_Crud - Fatal编程技术网

如何使用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);

    }
}