Java collection实例电影尝试

目录

声明arraylist

解决方案

示例代码

总结

错误原因

解决方案

[方案 1: 将 deleteActor 方法改为静态方法](#方案 1: 将 deleteActor 方法改为静态方法)

[方案 2: 创建一个 MovieOperator 实例并调用 deleteActor 方法](#方案 2: 创建一个 MovieOperator 实例并调用 deleteActor 方法)

选择方案

关键更改:

个人总结:主要是start给他声明了static导致的错误,start变成静态方法后,不能在调用非静态的方法deleteActor,去掉static即可。


声明arraylist

在图片中的代码里,声明了一个 ArrayList 的方式有误。具体来说,泛型 <String> 应该被写作 String 而不是尖括号包裹的形式。

正确的写法应该是:

java

复制

复制代码
List movies = new ArrayList<String>();

或者更简洁地使用Java 7及以上的钻石语法(可以省略右侧的类型):

java

复制

复制代码
List<String> movies = new ArrayList<>();

这样就可以正确地声明一个存储字符串类型的 ArrayList 了。

报错

哪错了

Preview

在这段代码中,有几个地方需要注意和修正:

  1. 方法签名 :方法签名中的List应该指定具体的类型,比如List<Movie>。这样可以提高代码的可读性和类型安全性。

  2. 循环条件 :在for循环中,i >= 0是正确的,但建议使用更明确的条件,如i >= 0 && i < movies.size(),虽然在这种情况下可能不是必须的,但它能避免潜在的数组越界错误。

  3. 数组访问 :在Java中,列表(List)是通过索引访问元素的,但是这里的movies[i].getActor()语法是正确的,假设Movie类有一个getActor()方法返回演员的名字。

  4. 删除元素 :在for循环中直接修改集合(如remove操作)可能会导致ConcurrentModificationException。为了避免这个问题,可以使用迭代器(Iterator)来遍历并删除元素,或者先将要删除的元素存储在一个临时集合中,遍历结束后再进行删除。

  5. 注释:注释部分提到的三种删除方式中,第三种方式没有给出具体实现,需要补充完整。

以下是修正后的代码示例:

复制代码

java

深色版本

复制代码
public void deleteActor(List<Movie> movies, String actor) {
    // 使用迭代器安全地删除元素
    Iterator<Movie> iterator = movies.iterator();
    while (iterator.hasNext()) {
        Movie movie = iterator.next();
        if (movie.getActor().equals(actor)) {
            iterator.remove();
        }
    }
}

这样可以确保在遍历过程中安全地删除元素,避免了ConcurrentModificationException

arraylist L,胺索引访问是不是L[i]

在Java中,ArrayList 并不支持使用方括号 [] 语法进行索引访问。要访问 ArrayList 中的元素,应该使用 get 方法。例如,如果你有一个 ArrayList 名为 L,并且想要访问索引 i 处的元素,你应该这样写:

复制代码

java

深色版本

复制代码
L.get(i);

这将返回位于索引 i 的元素。记住,ArrayList 的索引是从0开始的,所以第一个元素是 L.get(0),第二个元素是 L.get(1),以此类推。

此外,你还可以使用 set 方法来修改指定索引处的元素值,例如:

复制代码

java

深色版本

复制代码
L.set(i, newValue);

这里 newValue 是你想要放置在这个位置的新值。这种方法会替换原有的值,并且不会改变列表的大小。

咋了

Preview

从截图中可以看到,IDE(如IntelliJ IDEA)提示了一个错误信息,指出类 MovieOperatorpublic 类型,因此应该在文件 MovieOperator.java 中声明。具体错误信息如下:

复制代码

深色版本

复制代码
类 'MovieOperator' 为 public,应在文件 'MovieOperator.java' 中声明

这意味着你定义了一个 public 类,但该类没有被放在与类名同名的 .java 文件中。为了修复这个问题,你需要确保以下几点:

  1. 文件命名 :确保你的源代码文件名为 MovieOperator.java
  2. 文件路径 :确保 MovieOperator.java 文件位于正确的包目录下。

解决方案

  1. 重命名文件

    • 右键点击文件名 MovieOperator.java,选择 Refactor -> Rename
    • 确保文件名与类名一致。
  2. 检查文件路径

    • 确保 MovieOperator.java 文件位于正确的包目录下。例如,如果你的包名为 com.example.movie,则文件路径应为 src/main/java/com/example/movie/MovieOperator.java

示例代码

假设你的类定义如下:

复制代码

java

深色版本

复制代码
package com.example.movie;

import java.util.List;

public class MovieOperator {
    // 在这里创建集合
    private static List<Movie> movies = new ArrayList<>();

    public static void main(String[] args) {
        System.out.println("输入电影");
        // 其他代码...
    }
}

确保这个类定义在一个名为 MovieOperator.java 的文件中,并且文件路径正确。

总结

  • 确保类名和文件名一致。
  • 确保文件路径正确,符合包结构。

这样就可以解决 IDE 提示的错误。

package collection_movie; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Scanner; public class MovieOperator { //在这里创建集合 private static List<Movie> movies=new ArrayList<>(); public static void start() { movies.add(new Movie("wwhm","myay")); movies.add(new Movie("whyq","gyzs")); movies.add(new Movie("lrnz","myay")); movies.add(new Movie("bqnz","myay")); movies.add(new Movie("wwhm2","myay2")); System.out.println(movies); System.out.println("操作系统======"); Scanner cm=new Scanner(System.in); String s=cm.next(); if (s.equals("1")) { System.out.println("输入删除主演名"); String t=cm.next(); deleteActor(movies,t); } } public void addMovie(List movies, Movie amovie){ movies.add(amovie); } public void deleteActor(List movies,String actor){ //一边遍历一遍删除:1.索引+i--2.倒着遍历(利用索引)3、迭代器it // for (int i = movies.size()-1; i >=0 ; i--) { // if(actor.equals(movies.get(i).getActor())) // System.out.println(movies.remove(i)); // // } Iterator<Movie> it=movies.iterator(); while(it.hasNext()) { if((it.next().getActor()).equals(actor)) it.remove(); } } } 报错

Preview

从错误信息来看,问题出在 start 方法中调用 deleteActor 方法时的静态上下文问题。具体来说,deleteActor 方法是一个实例方法,而你在 start 方法中尝试以静态方式调用它。

错误原因

  • deleteActor 是一个实例方法,不能直接在静态上下文中(如 static 方法或 static 块)被调用。
  • start 方法是静态方法,因此不能直接调用非静态方法。

解决方案

  1. deleteActor 方法改为静态方法

    • 这样可以直接在静态上下文中调用。
  2. 创建一个 MovieOperator 实例并调用 deleteActor 方法

    • 这样可以在静态上下文中通过实例来调用非静态方法。
方案 1: 将 deleteActor 方法改为静态方法
复制代码

java

深色版本

复制代码
public static void deleteActor(List<Movie> movies, String actor) {
    Iterator<Movie> it = movies.iterator();
    while (it.hasNext()) {
        if (it.next().getActor().equals(actor)) {
            it.remove();
        }
    }
}
方案 2: 创建一个 MovieOperator 实例并调用 deleteActor 方法
复制代码

java

深色版本

复制代码
public class MovieOperator {
    // 在这里创建集合
    private static List<Movie> movies = new ArrayList<>();

    public static void start() {
        movies.add(new Movie("wwhm", "myay"));
        movies.add(new Movie("whyq", "gyzs"));
        movies.add(new Movie("lrnz", "myay"));
        movies.add(new Movie("bqnz", "myay"));
        movies.add(new Movie("wwhm2", "myay2"));
        System.out.println(movies);
        System.out.println("操作系统======");
        Scanner cm = new Scanner(System.in);

        String s = cm.next();
        if (s.equals("1")) {
            System.out.println("输入删除主演名");
            String t = cm.next();
            MovieOperator operator = new MovieOperator();
            operator.deleteActor(movies, t);
        }
    }

    public void addMovie(List<Movie> movies, Movie amovie) {
        movies.add(amovie);
    }

    public void deleteActor(List<Movie> movies, String actor) {
        Iterator<Movie> it = movies.iterator();
        while (it.hasNext()) {
            if (it.next().getActor().equals(actor)) {
                it.remove();
            }
        }
    }
}

选择方案

  • 如果你希望保持 deleteActor 方法为实例方法,并且在其他地方可能需要实例化 MovieOperator 类,那么选择方案 2。
  • 如果你希望简化代码,并且不需要实例化 MovieOperator 类,那么选择方案 1。

根据你的需求选择合适的方案进行修改即可。

在这段代码中,getActor() 方法没有被调用成功是因为在 Operator 类的 deleteActor 方法的条件判断中存在错误。具体问题如下:

  1. 类型不匹配 :在 if(movies.get(i).getActor()) 这行代码中,getActor() 方法的返回值是 String 类型,而你正在尝试将其用于布尔上下文中(即作为条件表达式)。这会导致编译错误,因为 String 不能直接用作布尔值。

  2. 缺少比较操作符 :即使 getActor() 返回的是 String 类型,你也应该使用 .equals() 方法来比较两个字符串是否相等,而不是直接使用 == 操作符。

修正后的代码应该如下所示:

java

复制

复制代码
public void deleteActor(List<Movie> movies, String actor) {
    // 一边遍历一边删除: 1.索引i-- 2.倒着遍历(利用索引)3、?
    for (int i = movies.size() - 1; i >= 0; i--) {
        if (movies.get(i).getActor().equals(actor)) { // 使用 .equals() 比较字符串
            movies.remove(i);
        }
    }
}

这样,getActor() 方法就会被正确调用了,并且能够根据提供的演员名称从电影列表中删除相应的电影。

用户_uBiEPA

还不对

image

PNG

89.97KB

image

PNG

73.39KB

ChatGLM

引用

在你的代码中,确实有一些问题和改进的地方。以下是一些关键点:

  1. 类型参数 :在 addMovie 方法中,你应该指定 List 的泛型类型为 Movie,以确保只能添加 Movie 对象到列表中。

  2. 循环方向 :在 deleteActor 方法中,你使用了倒序遍历来避免在删除元素时影响后续元素的索引。这是正确的做法,但需要注意循环的条件和更新。

  3. 字符串比较 :你已经正确使用了 .equals() 方法来比较字符串。

  4. 方法签名:确保方法的访问修饰符和方法名的一致性。

以下是修正后的代码示例:

java

复制

复制代码
package collection_movie;

import java.util.List;

public class Operator {
    public void addMovie(List<Movie> movies, Movie amovie) {
        movies.add(amovie);
    }

    public void deleteActor(List<Movie> movies, String actor) {
        // 倒序遍历以安全删除元素
        for (int i = movies.size() - 1; i >= 0; i--) {
            if (actor.equals(movies.get(i).getActor())) {
                movies.remove(i);
            }
        }
    }
}

public class Movie {
    private String name;
    private String actor;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }
}

关键更改:

  • addMovie 方法中,将 List 的泛型类型明确指定为 Movie
  • 确保 deleteActor 方法的循环条件和更新逻辑正确无误。
  • 确保所有方法和变量的命名一致且符合 Java 编码规范。

这样,你的代码应该能够正常工作了。希望这些信息对你有所帮助!

个人总结:主要是start给他声明了static导致的错误,start变成静态方法后,不能在调用非静态的方法deleteActor,去掉static即可。

然后,在示范中,main只写了调用operator类,集合的创建也在operator中进行的。

集合arraylist是private static

扫描器scanner也是private static,均写在operator类中

相关推荐
失去妙妙屋的米奇30 分钟前
matplotlib数据展示
开发语言·图像处理·python·计算机视觉·matplotlib
搞不懂语言的程序员1 小时前
备忘录模式深度解析与实战案例
数据库·python·备忘录模式
angushine1 小时前
Gateway获取下游最终响应码
java·开发语言·gateway
爱的叹息2 小时前
关于 JDK 中的 jce.jar 的详解,以及与之功能类似的主流加解密工具的详细对比分析
java·python·jar
Lhuu(重开版2 小时前
2025第十六届蓝桥杯PythonB组部分题解
python
一一Null2 小时前
Token安全存储的几种方式
android·java·安全·android studio
AUGENSTERN_dc2 小时前
RaabitMQ 快速入门
java·后端·rabbitmq
程丞Q香2 小时前
python——学生管理系统
开发语言·python·pycharm
晓纪同学2 小时前
C++ Primer (第五版)-第十三章 拷贝控制
java·开发语言·c++