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

Java仅用数组实现指定导演电影按分类输出的问题求助

按分类分组输出指定导演的电影(仅用数组与循环实现)

问题背景

现有80行4列的电影销售CSV数据(含表头),已存入二维数组movieCinema,列对应关系:

  1. 第1列(数组索引0):idSale(销售ID,无重复)
  2. 第2列(数组索引1):Movie(电影名)
  3. 第3列(数组索引2):Genre(分类)
  4. 第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. 列索引修正:原问题中列的编号从1开始,数组索引从0开始,因此Director列对应索引3,Genre列对应索引2,Movie列对应索引1,调用search函数时需注意参数正确性。
  2. 直接遍历原始数组:避免依赖重复分类与电影数组的顺序对应关系,减少逻辑复杂度。
  3. 本地去重:在收集每个分类下的电影时做去重,确保同一电影只输出一次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:02:07