【问题标题】:How can I access class private members using array of objects in main()?如何使用 main() 中的对象数组访问类私有成员?
【发布时间】:2019-02-03 11:01:41
【问题描述】:

我有一个包含 4 个私人成员的类电影。我想使用电影类对象数组访问 main() 中的这个私有成员。我在电影类有 4 个成员,分别是电影名称、电影导演、电影演员、电影收入。我创建了一个参数化构造函数,它有 4 个参数和一个 to-String 方法来显示此类成员的详细信息。现在,我想将电影收入从高到低排序,并根据该收入显示电影名称。

class Movie {
    private String movieName;
    private String movieDirector;
    private String movieActor;
    private double movieEarning;

    Movie(String movieName, String movieDirector, String movieActor, double movieEarning) {
        this.movieName = movieName;
        this.movieDirector = movieDirector;
        this.movieActor = movieActor;
        this.movieEarning = movieEarning;
    }

    public String toString() {
        return "\n" + "Movie Name = " + movieName + "\n" + "Movie Director =" + movieDirector + "\n" + "Movie Actor = " + movieActor + "\n" + "Movie Earning = " + movieEarning;
    }
    public void movieData() {
        //Print movie name where director = Rohit Shetty
        if (movieDirector.equals("Rohit Shetty") || movieDirector.equals("rohit shetty"))
            System.out.println("Movie Name=" + movieName);
        //Print director name who earned between 300 - 500
        if (movieEarning > 300 && movieEarning < 500)
            System.out.println("Print Director Names who earns more than 300 crores= " + movieDirector);
        //print moive details where actor = salman khan && director=kabir khan
        if (movieActor.equals("Salman Khan") && movieDirector.equals("kabir khan")) {
            System.out.println("Print Movie Names = " + movieName);
            System.out.println("Print Movie Earning = " + movieEarning);
        }
        //print movie name whose actor name starts with s
        if (movieActor.startsWith("s"))
            System.out.println("Print Actor Name where movie name starts with 's' = " + movieName);

        //print movie name with order of highest earning to lowest earning
    }


}

public class MovieDemo2 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String movieName;
        String movieDirector;
        String movieActor;
        double movieEarning;
        Movie[] movieObj;
        movieObj = new Movie[6];
        for (int i = 1; i < movieObj.length; i++) {
            System.out.print("Enter " + i + " movie name :");
            movieName = sc.next();
            sc.nextLine();
            System.out.print("Enter " + i + " movie director name :");
            movieDirector = sc.next();
            sc.nextLine();
            System.out.print("Enter " + i + " movie actor: ");
            movieActor = sc.next();
            sc.nextLine();
            System.out.print("Enter " + i + " movie earning: ");
            movieEarning = sc.nextDouble();
            sc.nextLine();
            movieObj[i] = new Movie(movieName, movieDirector, movieActor, movieEarning);
            System.out.println(movieObj[i]);

        }
        for (int i = 1; i < movieObj.length; i++) {
            movieObj[i].movieData();
        }
    }

}

我希望输出当我输入电影收入六次时,我将按收入最高到最低电影收入的顺序显示电影名称。例如,我输入值为 400,500,200,800,100,然后这给了我一个从高到低的电影名称列表。

【问题讨论】:

  • 你需要实现Comparable或者在使用sort方法时通过Comparator
  • 我曾尝试使用 sort 方法,但它仅适用于一个数据,不适用于所有 6 个班级成员,那么我该怎么办?
  • 数组索引从 0 开始。所以,for 循环应该像 int i=0 一样开始。
  • 注意:最好在需要时定义变量,而不是在方法的开头。例如,您可以使用String movieName = sc.next();
  • @radhikathakkar,请编辑问题并添加您尝试排序的代码。

标签: java class oop object private-members


【解决方案1】:

这里我试图演示如何对数组进行排序。我为此使用了Arrays.sort()

注意Movie 类实现了java.lang.Comparable 接口。所以,Movie 类必须实现Comparable 的方法compareTo(),我在这里做了。

import java.util.Arrays;

public class SortMovies
{
  public static void main(String[] args)
  {
    Movie[] movies = new Movie[6];
    movies[0] = new Movie("Movie 1", "Director 1", "Actor 1", 100.5);
    movies[1] = new Movie("Movie 2", "Director 2", "Actor 2", 300.5);
    movies[2] = new Movie("Movie 3", "Director 3", "Actor 3", 200.5);
    movies[3] = new Movie("Movie 4", "Director 4", "Actor 4", 700.5);
    movies[4] = new Movie("Movie 5", "Director 5", "Actor 5", 500.5);
    movies[5] = new Movie("Movie 6", "Director 6", "Actor 6", 400.5);

    // Assuming that you have built this movies array somehow

    // Sort
    Arrays.sort(movies);

    // Print sorted array
    for (Movie m : movies)
    {
      System.out.println(m);
    }
  }
}

class Movie implements Comparable<Movie>
{
  private String movieName;
  private String movieDirector;
  private String movieActor;
  private double movieEarning;

  Movie(String movieName, String movieDirector, String movieActor, double movieEarning)
  {
    this.movieName = movieName;
    this.movieDirector = movieDirector;
    this.movieActor = movieActor;
    this.movieEarning = movieEarning;
  }

  @Override
  public String toString()
  {
    return "\n" + "Movie Name = " + movieName + "\n" + "Movie Director =" + movieDirector + "\n" + "Movie Actor = " +
        movieActor + "\n" + "Movie Earning = " + movieEarning;
  }

  @Override
  public int compareTo(Movie otherMovie)
  {
    if (this.movieEarning > otherMovie.movieEarning)
    {
      return -1;
    }
    else if (this.movieEarning < otherMovie.movieEarning)
    {
      return 1;
    }
    else
    {
      return 0;
    }
  }
}

【讨论】:

  • @PrasantKarunagoda,非常感谢
  • @PrasantKarunagoda,但我有一个问题。我可以对扫描仪类做同样的事情吗?因为我想要用户的 i/p
  • @radhikathakkar,是的,你可以这样做。我只展示了排序部分。您可以使用来自Scanner 的输入构建Movie 对象,就像您在问题中的main() 方法中所做的那样。正如我在之前的评论中提到的,您需要从 0 开始循环(如 for(int =0 ...)
  • @radhikathakkar,不客气。如果它解决了您的问题,请接受答案:)
  • @radhikathakkar 使用sc.nextLine() 而不是next() 来读取全名。 next() 只读取第一个字符串。
猜你喜欢
  • 1970-01-01
  • 2016-01-20
  • 2013-12-30
  • 2011-06-10
  • 2019-02-14
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多