【问题标题】:How to make an array for every object within an array?如何为数组中的每个对象创建一个数组?
【发布时间】:2015-02-11 06:50:05
【问题描述】:

我有一个从列表中挑选项目的代码,我有一个扫描仪检查文件(其中包含电影,然后每行有演员)并将电影添加到数组中。我将如何使它添加到数组列表中的每一部电影也存储在线上的演员?例如: 每一行将是电影名称(日期)/姓氏、名字/姓氏2、名字2/等等。我的代码包含一个类 Movie,它将电影名称转换为字符串。我如何能够在任何给定点搜索任何电影并让它拉出所有主演的演员?

 public void loadDataFromFile(String fileName){
    /**
     * This method takes in one parameter, a file name, and prints out the data from that file
     */
    Scanner theScanner3 = null;
    myMovies = new ArrayList<Movie>();
        try{    
         theScanner3 = new Scanner(new FileInputStream(fileName));}

        catch(Exception ex){
            System.err.println("IndexOutOfBoundsException: " + ex.getMessage());
            }

        while( theScanner3.hasNextLine()){
        int i = 1;
        i = i+1;
            Movie foo = new Movie(theScanner3.nextLine());
            myMovies.add(foo);

        }
        theScanner3.close();
        }

我需要能够搜索电影的名称,并将它返回给我,该名称与该电影在同一行的每个演员。但是,我不知道该怎么做。

【问题讨论】:

    标签: java arrays eclipse


    【解决方案1】:

    您不想将 myMovies 设置为 ArrayList,而是将其设置为 Map。 但在此之前,您需要创建一个单独的 ArrayList,其中包含该电影的演员。 所以它会是:

    ArrayList<String> actors = new ArrayList<String>();
    

    然后:

    Map<Movie, ArrayList<String>> myMovies = new HashMap<Movie, ArrayList<String>>();
    

    您想在读入所有行之前创建 myMovies,如果您想随时访问它,甚至可以将其设置为全局变量。 为了获得该特定电影的所有演员,您需要执行以下操作:

    ArrayList<String> movieActors = myMovies.get([movie_object]);
    String firstActor = movieActors.get(0);
    

    例如:

    Map<Movie, ArrayList<String>> myMovies = new HashMap<Movie, ArrayList<String>>();
    ...
    while(theScanner3.hasNextLine()) {
        int i = 1;
        i += 1
        ArrayList<String> actors = new ArrayList<String>();
        //
        //do some splits using delimiters to separate out name of the movie and actors
        //for example, let's say the strings are in an array called 'split'
        //where split[0] is the movie title
        //and everything that follows afterwards are the actor names
        //
        String movieName = split[0]
        for(int j = 1; j < split.length; j++) {
            actors.add(split[j]);
        }
        //creating the objects
        Movies foo = new Movie(movieName);
        //now to store the movie and the arraylist of actors into myMovies
        myMovies.put(foo, actors);
        ...
    

    实现此目的的另一种方法是将演员名称放在 Movie 对象中。这样您就可以调用该特定电影的 create 并调用 get 方法,该方法可以返回演员姓名列表。

    【讨论】:

      【解决方案2】:

      最好的方法是使用地图。

      它在键(本例中为电影)和值(本例中为演员列表)之间建立关系。

      将其视为按电影分类(分组)的演员集合。

      声明:

      Map<Movie, List<Actor>> actorsByMovies = new HashMap<>();
      

      添加电影:

      Movie newMovie = ...
      actorsByMovies.put(newMovie, new ArrayList<>());
      

      从电影中获取演员:

      Movie myMovie = ...
      List<Actor> actors = actorsByMovies.get(myMovie);
      

      获取所有电影:

      Set<Movie> allMovies = actorsByMovies.keySet();
      

      检查电影:

      Movie myMovie = ...
      boolean doesMovieExist = actorsByMovies.containsKey(myMovie);
      

      这里还有reference

      希望这会有所帮助。
      祝你好运。

      【讨论】:

      • 你能详细说明一下吗?就像我将这些放在哪里 - 我是否必须从上面的表格中修改它们?我会将它们放在电影类还是主代码中?
      • 这些都不属于电影类。它们只会出现在您的主代码中。特别是声明和添加电影将在loadDataFromFile 方法中,它应该返回地图。其他的在您需要时很有用。
      • 将其视为按电影分类(分组)的演员集合。
      • 好吧,我把你放在那里的声明放在从文件中加载数据中。但我仍然不知道如何从特定电影中获取演员。我不知道应该用什么替换 ... 以获取下面的代码以返回所有演员。
      • 例如Movie myMovie = actorsByMovies.keySet().toArray()[3];
      【解决方案3】:

      您的Movie 类可以存储您想要保留的有关每部电影的所有信息。这可能包括电影中所有演员的名单。它还可以包括一种从扫描仪创建电影的方法:

      class Movie {
          private final String name;
          private final Person director;
          private final List<Person> actors;
          private final int yearOfRelease;
      
          public Movie makeFromScanner(Scanner movieScanner) {
              Movie movie = new Movie();
              movie.yearOfRelease = movieScanner.nextInt();
              ...
              return movie.
          }
      
          public boolean hasActor(Person actor) {
              return actors.contains(actor);
          }
      }
      

      如果您将电影列表存储为列表:

      List<Movie> movies;
      

      然后,例如,查找具有特定演员的所有电影将是:

      Set<Person> moviesWithActor = movies.stream()
          .filter(movie -> movies.hasActor(myActor))
          .collect(Collectors.toSet());
      

      或查找电影的所有演员:

      Set<Person> actorsForMovie = movies.stream()
          .filter(movie -> movie.hasName(myMovie))
          .collect(Collectors.toSet());
      

      虽然使用Map 之类的名称快速按名称查找电影显然会更有效,但除非您拥有数百万部电影或每秒搜索多次,否则没有必要:详尽搜索即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-12
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多