You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java继承与ArrayList排序问题:读取文件后集合为空

Java项目问题:ArrayList始终为空,无法读取电影数据

我有一个Java项目,要求使用继承和ArrayList从文件读取电影数据,按年份排序后展示输出,但代码中的ArrayList始终为空,排查不出问题所在。相关信息如下:

项目代码

Main类

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        Driver driver = new Driver();
        driver.start();
    }
}

Driver类

import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JOptionPane;
import java.io.*;

public class Driver {
    public void start() throws FileNotFoundException{
        // 初始化ArrayList
        ArrayList<Movie> adventure = new ArrayList<>();
        ArrayList<Movie> drama = new ArrayList<>();
        ArrayList<Movie> fantasy = new ArrayList<>();
        ArrayList<Movie> romance = new ArrayList<>();
        ArrayList<Movie> sciFi = new ArrayList<>();
        ArrayList<Movie> thriller = new ArrayList<>();
        ArrayList<Movie> war = new ArrayList<>();
        
        File myObj = new File("MovieListing.txt");
        Scanner myReader = new Scanner(myObj);
        String directorName = myReader.nextLine();
        String composerName = myReader.nextLine();
        
        while(myReader.hasNextLine()) {
            String movie = myReader.nextLine();
            String[] movieInfo = movie.split(",");
            String title = movieInfo[0];
            int year = Integer.parseInt(movieInfo[1]);
            String genre = movieInfo[2];
            String rating = movieInfo[3];
            
            Movie movie1 = new Movie(title,year,genre,rating,directorName,composerName);
            
            // 将电影分类到对应ArrayList
            if (genre.equals("Adventure")) {
                adventure.add(movie1);
            } else if (genre.equals("Drama")) {
                drama.add(movie1);
            } else if (genre.equals("Fantasy")) {
                fantasy.add(movie1);
            } else if (genre.equals("Romance")) {
                romance.add(movie1);
            } else if (genre.equals("Sci Fi")) {
                sciFi.add(movie1);
            } else if (genre.equals("Thriller")) {
                thriller.add(movie1);
            } else if (genre.equals("War")) {
                war.add(movie1);
            }
        }
        myReader.close();
        
        System.out.print(adventure);
        for(Movie movie:war) {
            System.out.print(movie.getTitle());
        }
        
        // 询问用户想查看的类型
        String genre = JOptionPane.showInputDialog("Director: " +directorName +  "\n" +
                "Composer: " + composerName + "\n" +
                "Which genre would you like? \n" +
                "1. Adventure \n" +
                "2. Drama \n" +
                "3. Fantasy \n" +
                "4. Romance \n" +
                "5. SciFi \n" +
                "6. Thriller \n" +
                "7. War \n" +
                "Your choice: ");

        // 按发行年份排序
        adventure.sort(new MovieComparator());
        drama.sort(new MovieComparator());
        fantasy.sort(new MovieComparator());
        romance.sort(new MovieComparator());
        sciFi.sort(new MovieComparator());
        thriller.sort(new MovieComparator());
        war.sort(new MovieComparator());
        
        // 生成输出内容
        String output = "Director: " +directorName + "\n" +
                "Composer: " +composerName + "\n" +
                "Genre: " + genre + "\n" +
                "Movie Title\tYear Released\tRating\n";
        if (genre.equals("1")) {
            for (Movie movie : adventure) {
                output += movie.getTitle() + "\t\t" + movie.getYearReleased() + "\t\t" + movie.getRating() + "\n";
            }
        } else if (genre.equals("2")) {
            for (Movie movie : drama) {
                output += movie.getTitle() + "\t\t" + movie.getYearReleased() + "\t\t" + movie.getRating() + "\n";
            }
        } else if (genre.equals("3")) {
            for (Movie movie : fantasy) {
                output += movie.getTitle() + "\t\t" + movie.getYearReleased() + "\t\t" + movie.getRating() + "\n";
            }
        } else if (genre.equals("4")) {
            for (Movie movie : romance) {
                output += movie.getTitle() + "\t\t" + movie.getYearReleased() + "\t\t" + movie.getRating() + "\n";
            }
        } else if (genre.equals("5")) {
            for (Movie movie : sciFi) {
                output += movie.getTitle() + "\t\t" + movie.getYearReleased() + "\t\t" + movie.getRating() + "\n";
            }
        } else if (genre.equals("6")) {
            for (Movie movie : thriller) {
                output += movie.getTitle() + "\t\t" + movie.getYearReleased() + "\t\t" + movie.getRating() + "\n";
            }
        } else if (genre.equals("7")) {
            for (Movie movie : war) {
                output += movie.getTitle() + "\t\t" + movie.getYearReleased() + "\t\t" + movie.getRating() + "\n";
            }
        }
        JOptionPane.showMessageDialog(null, output);
    }
}

Movie类

public class Movie extends Director {
    private String title;
    private int yearReleased;
    private String genre;
    private String rating;

    public Movie(String title, int yearReleased, String genre, String rating, String directorName, String composerName) {
        super(directorName, composerName);
        this.title = title;
        this.yearReleased = yearReleased;
        this.genre = genre;
        this.rating = rating;
    }
    
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }
    public int getYearReleased() { return yearReleased; }
    public void setYearReleased(int yearReleased) { this.yearReleased = yearReleased; }
    public String getGenre() { return genre; }
    public void setGenre(String genre) { this.genre = genre; }
    public String getRating() { return rating; }
    public void setRating(String rating) { this.rating = rating; }
}

Director类

public class Director {
    private String directorName;
    private String composerName;
    
    public Director(String d, String c) {
        this.directorName = d;
        this.composerName = c;
    }
    
    public String getDirectorName() { return directorName; }
    public void setDirectorName(String directorName) { this.directorName = directorName; }
    public String getComposerName() { return composerName; }
    public void setComposerName(String composerName) { this.composerName = composerName; }
}

数据文件格式

数据文件名为MovieListing.txt,格式如下:

  • 第1行:导演姓名
  • 第2行:作曲家姓名
  • 从第3行开始,每行是一条电影数据,格式为电影标题,年份,类型,评级,示例行:
    Amistad,1997,Drama,R
    The Post,2017,Drama,PG-13
    

预期输出格式

Director:     Steven Spielberg
Composer: John Williams

Genre:  Drama

Movie Title   Year Released    Rating
Amistad               1997               R
The Post              2017               PG-13

问题排查与解决方案

核心问题:类型匹配失败

ArrayList为空的最可能原因是数据字段的空格问题:数据文件中用逗号分割后,类型字段可能带有前后空格(比如" Drama"而非"Drama"),导致代码中genre.equals("Drama")这类判断无法匹配,所有电影都没被加入对应的ArrayList。

解决方案

  1. 处理字段空格:在分割字符串后,给每个字段加上trim()去除前后空格:

    String[] movieInfo = movie.split(",");
    String title = movieInfo[0].trim();
    int year = Integer.parseInt(movieInfo[1].trim());
    String genre = movieInfo[2].trim();
    String rating = movieInfo[3].trim();
    
  2. 补全MovieComparator类:代码中调用了排序方法但未提供该类,需补充实现按年份排序的比较器:

    import java.util.Comparator;
    
    public class MovieComparator implements Comparator<Movie> {
        @Override
        public int compare(Movie m1, Movie m2) {
            return Integer.compare(m1.getYearReleased(), m2.getYearReleased());
        }
    }
    
  3. 优化用户输入显示:当前输出中Genre显示的是用户输入的数字(比如"2"),可改为对应的类型名称,示例修改:

    String genreName = "";
    if (genre.equals("1")) {
        genreName = "Adventure";
        // ... 循环添加电影
    } else if (genre.equals("2")) {
        genreName = "Drama";
        // ...
    }
    // 生成输出时替换为genreName
    String output = "Director: " +directorName + "\n" +
            "Composer: " +composerName + "\n" +
            "Genre: " + genreName + "\n" +
            "Movie Title\tYear Released\tRating\n";
    

内容的提问来源于stack exchange,提问作者Niteesh Kulhari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:10:33