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类中

相关推荐
万叶学编程1 小时前
@RequestParam 和 @RequestBody、HttpServletrequest 与HttpServletResponse
java
zfj3212 小时前
H2数据库源码学习+debug, 数据库 sql、数据库引擎、数据库存储从此不再神秘
java·数据库·sql·学习·数据库底层原理
未来可期叶3 小时前
如何用Python批量解压ZIP文件?快速解决方案
python
编程、小哥哥3 小时前
Java面试实战:从Spring Boot到分布式缓存的深度探索
java·spring boot·redis·微服务·grpc·缓存技术·面试技巧
张槊哲3 小时前
ROS2架构介绍
python·架构
在未来等你3 小时前
互联网大厂Java求职面试:Spring AI与大模型交互的高级模式与自定义开发
java·微服务·云原生·大模型·spring ai
androidwork3 小时前
Android Kotlin权限管理最佳实践
android·java·kotlin
sakoba3 小时前
Tomcat简述介绍
java·tomcat
babytiger4 小时前
为 Windows 和 Ubuntu 中设定代理服务器的详细方法
linux·windows·ubuntu
风逸hhh4 小时前
python打卡day29@浙大疏锦行
开发语言·前端·python