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。
解决方案
处理字段空格:在分割字符串后,给每个字段加上
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();补全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()); } }优化用户输入显示:当前输出中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
相关产品推荐
相关产品推荐

