Java仅用数组实现指定导演电影按分类输出的问题求助
按分类分组输出指定导演的电影(仅用数组与循环实现)
问题背景
现有80行4列的电影销售CSV数据(含表头),已存入二维数组movieCinema,列对应关系:
- 第1列(数组索引0):idSale(销售ID,无重复)
- 第2列(数组索引1):Movie(电影名)
- 第3列(数组索引2):Genre(分类)
- 第4列(数组索引3):Director(导演)
已知一部电影对应唯一分类和导演,需实现按分类分组输出Christopher Nolan的电影,要求仅使用数组、二维数组和for/while循环,禁止使用集合、哈希表等工具。
已实现search(提取指定条件的列数据)和uniqueValues(数组去重)函数,能获取该导演的重复/去重分类、电影数组,但无法完成分组输出。
解决方案
核心逻辑:直接遍历原始二维数组,针对该导演的每个去重分类,收集对应唯一电影后按格式输出。
步骤1:修正现有工具函数
原uniqueValues函数存在遍历起始索引错误、重复判断逻辑缺陷,修正后版本:
public static String[] uniqueValues(String[] array) { if (array == null || array.length == 0) { return new String[0]; } boolean duplicate; int uniqueCount = 0; // 统计唯一值数量 for (int i = 0; i < array.length; i++) { duplicate = false; // 检查当前元素之前的所有元素是否重复 for (int j = 0; j < i; j++) { if (array[i].equals(array[j])) { duplicate = true; break; } } if (!duplicate) { uniqueCount++; } } String[] uniqueArray = new String[uniqueCount]; int index = 0; // 填充唯一值数组 for (int i = 0; i < array.length; i++) { duplicate = false; for (int j = 0; j < i; j++) { if (array[i].equals(array[j])) { duplicate = true; break; } } if (!duplicate) { uniqueArray[index] = array[i]; index++; } } return uniqueArray; }
步骤2:实现分组输出函数
编写专门的输出函数,直接基于原始二维数组处理,避免依赖重复数组的对应关系:
public static void printMoviesByGenreForDirector(String[][] movieCinema, String targetDirector) { // 输出导演名称 System.out.println(targetDirector); // 获取该导演的所有去重分类 String[] directorGenresRepeated = search(movieCinema, targetDirector, 3, 2); String[] directorGenres = uniqueValues(directorGenresRepeated); // 遍历每个分类,输出对应电影 for (String genre : directorGenres) { System.out.println("Genre: " + genre); // 收集该导演下当前分类的唯一电影 // 先统计数量 int tempCount = 0; for (int i = 1; i < movieCinema.length; i++) { if (targetDirector.equals(movieCinema[i][3]) && genre.equals(movieCinema[i][2])) { tempCount++; } } String[] genreMovies = new String[tempCount]; int movieIndex = 0; for (int i = 1; i < movieCinema.length; i++) { if (targetDirector.equals(movieCinema[i][3]) && genre.equals(movieCinema[i][2])) { String currentMovie = movieCinema[i][1]; // 去重检查 boolean isDuplicate = false; for (int j = 0; j < movieIndex; j++) { if (genreMovies[j].equals(currentMovie)) { isDuplicate = true; break; } } if (!isDuplicate) { genreMovies[movieIndex] = currentMovie; movieIndex++; } } } // 输出电影列表 for (String movie : genreMovies) { if (movie != null) { System.out.println("- " + movie); } } } }
步骤3:主函数调用
在主函数中初始化movieCinema后,直接调用输出函数:
public static void main(String[] args) { // 假设movieCinema已完成CSV数据初始化 String targetDirector = "Christopher Nolan"; printMoviesByGenreForDirector(movieCinema, targetDirector); }
关键说明
- 列索引修正:原问题中列的编号从1开始,数组索引从0开始,因此Director列对应索引3,Genre列对应索引2,Movie列对应索引1,调用
search函数时需注意参数正确性。 - 直接遍历原始数组:避免依赖重复分类与电影数组的顺序对应关系,减少逻辑复杂度。
- 本地去重:在收集每个分类下的电影时做去重,确保同一电影只输出一次。
内容的提问来源于stack exchange,提问作者DR8
相关产品推荐
相关产品推荐

